Python 如何';拆分';基于条件和透视df的df列

Python 如何';拆分';基于条件和透视df的df列,python,pandas,dataframe,pivot,Python,Pandas,Dataframe,Pivot,我有4400行的df。在读取xlsx文件时创建此df 为了澄清我的问题,我创建了一个示例df 这将给出以下结果(我的真实问题的简化版本): 正如你所看到的,每个店名后面都是该店销售的三种产品的总数。 每家商店都有相同的产品。但是每个商店都有一个完全不同的名字 有4400行,许多商店都有不同的名称(但完全相同的产品),我想将我的df:shopnames作为第一列,所有的产品作为列名。从逻辑上讲,每个商店的产品数量正确地显示在右栏中 (对我来说)没有办法区分商店名称和产品名称。但是:每个店名下的产品

我有4400行的df。在读取xlsx文件时创建此df

为了澄清我的问题,我创建了一个示例df

这将给出以下结果(我的真实问题的简化版本):

正如你所看到的,每个店名后面都是该店销售的三种产品的总数。 每家商店都有相同的产品。但是每个商店都有一个完全不同的名字

有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
应该是
product2
。修复后,您可以执行以下操作:

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')

如果你要在问题回答后编辑输入数据,你应该在问题中大声说出,这样正确的答案就不会神奇地变成错误。你事先知道商店中的元素数量吗?克里斯,谢谢!作为一名58岁的学生,我印象深刻!但是我得承认我举了一个太简单的例子。很抱歉我的例子给人的印象是每个名字中都有shop这个词,但事实并非如此。。。。。希望你能想出另一个主意。每个商店的产品都一样,这有可能吗?再次感谢!!ps:我在我的帖子中改变了这个例子。@Janneman总是有相同数量的产品吗?或者产品名称总是包含“产品”?克里斯,产品的数量不一样。只有产品名称相同。再次感谢!克里斯,这个例子很好用。将它应用于我的真实df时会发生什么:它旋转,它创建列,在第一列/索引中获取所有不同的存储。但是在我最初的df中没有NaN值。Alltough您的代码与我的示例df一起工作,它在pivot df中创建了很多(allmost all)NaN值。您应该接受这个答案,因为它适合提供的示例数据,并询问另一个具有增强要求的答案:)Chris再次感谢。我会在几个小时内回来找你。以后!问候语Jan@Janneman如果问题解决了,请随意投票并接受答案。
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')