[英]How to 'split' a pandas df column based on conditional and pivot the df
我有 4400 行的 df。 在读取 xlsx 文件时创建了这个 df。
为了明确我的问题,我创建了一个示例 df。
这给出了以下结果(我的真实问题的简化版本):
shop amount
0 shop A 15
1 product 1 4
2 product 2 5
3 product 3 6
4 BBBB 19
5 product 1 7
6 product 2 9
7 product 3 3
8 CCCC 21
9 product 1 6
10 product 2 7
11 product 3 8
12 DDDD 18
13 product 1 4
14 product 2 3
15 product 3 11
如您所见,每个店名后面都是该店销售的三种产品的总数。 每家商店都有相同的产品。 但是每家店的名字都不一样。
拥有 4400 行和许多具有不同名称(但完全相同的产品)的商店,我想将我的 df: shopnames 作为第一列,将所有产品作为列名。 从逻辑上讲,每家商店的产品数量正确地显示在右栏中。
(对我来说)没有办法区分商店名称和产品名称。 但是:每个店名下方的产品列表完全相同且顺序相同。
我自己不知道如何从产品名称中“过滤”所有商店名称。 希望你们中的一个人对我有一个想法。 再次感谢! 问候简
ps:我使用此代码制作示例df:
d = {'shop': ['shop A', 'product 1', 'product2','product 3','BBBB', 'product 1', 'product 2','product 3','CCCC', 'product 1', 'product 2', 'product 3','DDDD', 'product 1', 'product 2', 'product 3'], 'amount': [15,4,5,6,19,7,9,3,21,6,7,8, 18,4,3,1]}
df = pd.DataFrame(data=d)
df
您的数据集中有错字, product2
应该是product 2
。 修复后,您可以执行以下操作:
import pandas as pd
import numpy as np
d = {'shop': ['shop A', 'product 1', 'product 2','product 3','shop B', 'product 1', 'product 2','product 3','shop C', 'product 1', 'product 2', 'product 3','shop D', 'product 1', 'product 2', 'product 3'], 'amount': [15,4,5,6,19,7,9,3,21,6,7,8, 18,4,3,1]}
df = pd.DataFrame(data=d)
# Create grouping column
df['g'] = np.where(df['shop'].str.contains('shop'), df['shop'], np.nan)
df = df.ffill()
# Get rows that have totals by shop
total_rows = df.groupby('g')['amount'].idxmax().values
# Drop total rows
df = df.loc[~df.index.isin(total_rows)]
# Rename columns
df.columns = ['product','amount','shop']
# Pivot
df.pivot_table(index='shop',columns='product',values='amount')
输出
product product 1 product 2 product 3
shop
shop A 4 5 6
shop B 7 9 3
shop C 6 7 8
shop D 4 3 1
假设您的商店名称是唯一的,并且产品是重复的:
d = {'shop': ['shop A', 'product 1', 'product 2','product 3','BBBB', 'product 1', 'product 2','product 3','CCCC', 'product 1', 'product 2', 'product 3','DDDD', 'product 1', 'product 2', 'product 3'], 'amount': [15,4,5,6,19,7,9,3,21,6,7,8, 18,4,3,1]}
df = pd.DataFrame(data=d)
g = df.groupby('shop').size().reset_index()
df['g'] = np.where(df['shop'].isin(g[g[0]==1]['shop'].values), df['shop'], np.nan)
# # Create grouping column
# df['g'] = np.where(df['shop'].str.contains('shop'), df['shop'], np.nan)
df = df.ffill()
# Get rows that have totals by shop
total_rows = df.groupby('g')['amount'].idxmax().values
# Drop total rows
df = df.loc[~df.index.isin(total_rows)]
# Rename columns
df.columns = ['product','amount','shop']
# Pivot
df.pivot_table(index='shop',columns='product',values='amount')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.