【问题标题】:Python - Transpose/Pivot a column based based on a different columnPython - 基于不同的列转置/旋转列
【发布时间】:2020-11-12 21:14:00
【问题描述】:

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

我有一个 pd 数据框,它是一个包含产品和销售国家/地区的连接表。 它有 3000 行和 50 列大小。

我正在上传一张我现在所处的现状以及我想要达到的预期结果的照片(只是 df 的一部分)。

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

谢谢!

【问题讨论】:

  • 嗨@NsN 我现在已经在我的回答中为您创建了一个示例数据框,但是在您的问题中添加一个示例数据框是一种很好的做法,因为这确实有助于其他人回答您的问题。不要添加照片,在文本/代码中添加数据框的示例。在这里你可以找到如何做到这一点的解释:stackoverflow.com/questions/20109391/…
  • 感谢@SandervandenOord 的提示。我一直在努力将其作为代码上传,但我会看看你所附的内容,以便下次更好地了解。

标签: python-3.x pandas


【解决方案1】:

使用.cumcount() 计算产品拥有的国家/地区数量。
然后使用.pivot() 使您的数据框具有正确的形状:

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

【讨论】:

  • 看起来不错,谢谢!我试图运行它,但得到一个“ValueError:传递值的长度是 6,索引意味着 2”
【解决方案2】:

试试这个:

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 创建国家列。然后使用列表推导展平多索引标题。

【讨论】:

  • 谢谢,斯科特!一个整洁的解决方案。在发布这篇文章之前尝试解决这个问题时,我尝试使用 .unstack() 和列表理解,但找不到像你一样将它组合在一起的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-02
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-26
相关资源
最近更新 更多