繁体   English   中英

如何根据条件“拆分”pandas df 列并旋转 df

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM