如何在Python中使用for循环来子集和列出数据帧?
我有一个3列1000多行的数据框如何在Python中使用for循环来子集和列出数据帧?,python,pandas,for-loop,dataframe,subset,Python,Pandas,For Loop,Dataframe,Subset,我有一个3列1000多行的数据框 df day product order 2010-01-01 150ml Mask 9 2010-01-02 230ml Lotion 27 2010-01-03 600ml Shampoo 33 我想将每个产品细分如下: df_mask df_lotion df_shampoo day
df
day product order
2010-01-01 150ml Mask 9
2010-01-02 230ml Lotion 27
2010-01-03 600ml Shampoo 33
我想将每个产品细分如下:
df_mask df_lotion df_shampoo
day order day order day order
2010-01-01 9 2010-01-02 27 2010-01-03 33
2010-01-09 8 2010-01-05 30 2010-01-04 25
2010-01-11 13 2010-01-06 29 2010-01-06 46
我就是这样做的
# 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循环一次性获得所有子集 看看它是否有帮助:
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
为了单独访问每个子组,您可以使用与您的子表
功能相对应的获取组
:
mask_df = products.get_group("Mask")
print(mask_df)
day product order
0 2010-01-01 Mask 9
3 2010-01-04 Mask 12
最后,要获得一个字典中的所有子数据帧,您可以循环使用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
我认为您可以使用
dict
存储所有DataFrames
,它是通过和创建的dict comprehension
:
如果您需要删除列产品
请使用子集[[['day'、'order']]
或:
谢谢你的回答。我尝试了
df[“product”]=df[“product”].str.split(expand=True)[1]
,但有些产品名称没有组织,因为有些产品名称看起来像0.7OZ Mask UK 6
。有没有其他办法解决这个问题?@peggy产品标签可能有哪些变化?提取产品名称完全取决于您的输入数据。但是,对于您在评论中给出的示例,df[“product”].str.split(expand=True)[1]
应该成功地从0.7OZ Mask UK 6
中提取Mask。或者你需要包括UK 6在内的面膜吗?是的。我需要面具。但我决定给每个产品分配一个特定的编号,以便于分类。除此之外,代码运行得很好。非常感谢你!
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
dfs = {i:df.reset_index(drop=True)[['day','order']] for i, df in df.groupby(producs)}
#dfs = {i:df.reset_index(drop=True).drop('product', axis=1) for i, df in df.groupby(producs)}
print (dfs)
{'Shampoo': day order
0 2010-01-03 33, 'Mask': day order
0 2010-01-01 9, 'Lotion': day order
0 2010-01-02 27}
print (dfs['Shampoo'])
day order
0 2010-01-03 33