Python 3.x Python-基于不同列对列进行转置/透视

Python 3.x Python-基于不同列对列进行转置/透视,python-3.x,pandas,Python 3.x,Pandas,我搜索了一下,确实发现了很多类似的问题,但似乎没有一个能回答我的问题 我有一个pd数据框,它是一个连接表,由产品和销售国家组成。 它有3000行和50列大小 我上传了一张照片(只是df的一部分),上面是我现在的处境和我想要达到的预期结果 我想将“国家名称”列转换为按“产品代码名称”分组的行。请注意,新的国家/地区栏不限于一定数量的国家/地区(有些产品有3个或40个) 谢谢大家! 用于统计产品拥有的国家数量。 然后使用以使数据帧处于正确的形状: df = pd.DataFrame({ '

我搜索了一下,确实发现了很多类似的问题,但似乎没有一个能回答我的问题

我有一个pd数据框,它是一个连接表,由产品和销售国家组成。 它有3000行和50列大小

我上传了一张照片(只是df的一部分),上面是我现在的处境和我想要达到的预期结果

我想将“国家名称”列转换为按“产品代码名称”分组的行。请注意,新的国家/地区栏不限于一定数量的国家/地区(有些产品有3个或40个)

谢谢大家!

用于统计产品拥有的国家数量。
然后使用以使数据帧处于正确的形状:

df = pd.DataFrame({
    'Country': ['NL', 'Poland', 'Spain', 'Sweden', 'China', 'Egypt'],
    'Product Code': ['123', '123', '115', '115', '117', '118'],
    'Product Name': ['X', 'X', 'Y', 'Y', 'Z', 'W'],
})

df['cumcount'] = df.groupby(['Product Code', 'Product Name'])['Country'].cumcount() + 1

df_pivot = df.pivot(
    index=['Product Code', 'Product Name'], 
    columns='cumcount', 
    values='Country',
).add_prefix('country_')
结果数据帧:

    cumcount             country_1  country_2
ProductCode Product Name        
115         Y            Spain      Sweden
117         Z            China      NaN
118         W            Egypt      NaN
123         X            NL         Poland
试试这个:

df_out = df.set_index(['Product code', 
                       'Product name', 
                       df.groupby('Product code').cumcount() + 1]).unstack()

df_out.columns = [f'Country_{j}' for _, j in df_out.columns]
df_out.reset_index()
输出:

  Product code Product name    Country_1 Country_2 Country_3
0       AAA115            Y       Sweden     China       NaN
1       AAA117            Z        Egypt    Greece       NaN
2       AAA118            W       France     Italy       NaN
3       AAA123            X  Netherlands    Poland     Spain
详情:


使用set_index和unstack重塑数据框,使用cumcount创建国家/地区列。然后使用列表理解将多索引标题展平。

Hi@NsN我现在在回答中为您创建了一个示例数据框,但在您的问题中添加一个示例数据框是一个很好的做法,因为这确实有助于其他人回答您的问题。不要添加照片,添加文本/代码中的数据框示例。在这里您可以找到如何做到这一点的解释:感谢@sandervandeoord的提示。我正在努力把它作为一个代码上传,但我会看看你的附件,这样我下次会知道的更好。看起来不错,谢谢!我试图运行它,但得到了一个“ValueError:传递值的长度是6,索引意味着2”谢谢,Scott!一个简洁的解决方案。在发布这篇文章之前,当我试图解决这个问题时,我尝试使用.unstack()和列表理解,但找不到一种方法将它们结合在一起,就像您所做的那样。