如何在Python中使用for循环对数据帧进行子集和列表?

2024-09-29 21:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个有3列1000多行的数据帧

df 
   day         product         order
2010-01-01    150ml Mask          9
2010-01-02    230ml Lotion       27
2010-01-03    600ml Shampoo      33

我想把每种产品细分如下:

^{pr2}$

我就是这样做的

# Create a product list 
productName = df['product'].tolist()

# Subsetting
def subtable(df,productName):
    return (df[(df['product'] == productName)])

# Subsetting
df_mask = subtable(df, '150ml Mask')
df_lotion = subtable(df, '230ml Lotion')
df_shampoo = subtable(df, '230ml Shampoo')

因为数据帧有许多不同的产品,有没有什么方法可以一次使用for循环得到所有的子集。在


Tags: 数据df产品createordermaskproduct细分
3条回答

我认为您可以使用dict来存储所有DataFrames,它是用^{}和{a2}创建的dict comprehension

producs = df['product'].str.split().str[-1]
print (producs)
0       Mask
1     Lotion
2    Shampoo
Name: product, dtype: object

dfs = {i:df.reset_index(drop=True) for i, df in df.groupby(producs)}
print (dfs)
{'Shampoo':           day        product  order
0  2010-01-03  600ml Shampoo     33, 'Mask':           day     product  order
0  2010-01-01  150ml Mask      9, 'Lotion':           day       product  order
0  2010-01-02  230ml Lotion     27}

print (dfs['Shampoo'])
          day        product  order
0  2010-01-03  600ml Shampoo     33

如果需要删除列product,请使用子集[['day','order']]或{a3}:

^{pr2}$

看看是否有帮助:

dfs = {}
for grp in df.groupby('product'):
    dfs[grp[0].split(' ')[1]] = grp[1] # split gives you the product name as key

for key in dfs.keys():
    print dfs[key]

为此,您可以使用^{},这正是您所需要的:

# show example data
print(df)

     day           product             order
0    2010-01-01    "150ml Mask"          9
1    2010-01-02    "230ml Lotion"       27
2    2010-01-03    "600ml Shampoo"      33
3    2010-01-04    "250ml Mask"         12
4    2010-01-05    "330ml Lotion"       24
5    2010-01-06    "400ml Shampoo"      13

# split product column and keep only product name
df["product"] = df["product"].str.split(expand=True)[1]

# groupby product
products = df.groupby("product")

# print product and corresponding product df
for product, product_df in products:
    print(product)
    print(product_df)

Lotion
          day product  order
1  2010-01-02  Lotion     27
4  2010-01-05  Lotion     24

Mask
          day product  order
0  2010-01-01    Mask      9
3  2010-01-04    Mask     12

Shampoo
          day  product  order
2  2010-01-03  Shampoo     33
5  2010-01-06  Shampoo     13

为了单独访问每个子组,可以使用与subtable函数相对应的get_group

^{pr2}$

最后,要获得一个字典中的所有子数据帧,可以循环products并删除product列本身:

df_dict = {product: product_df.drop("product", axis=1) 
          for product, product_df in products}
print(df_dict["Mask"])

    day         order
0   2010-01-01  9
3   2010-01-04  12

相关问题 更多 >

    热门问题