【问题标题】:Python pandas dataframe reshape long to wide, multiple columns and constant valuesPython pandas 数据框将长宽、多列和常量值重塑
【发布时间】:2018-05-08 14:11:53
【问题描述】:

我需要将 DataFrame 从长格式改成宽格式。数据外观示例:

import pandas as pd

df = pd.DataFrame({'id':[1,1,1,2,2,2,3,3], 'id_age':
30,30,30,23,23,23,29,29], 'product':['A','B','C','A','B','C','A','B'],
'rank':[1,2,3,3,1,2,2,1], 'result':['x','y','z','p','q','r','s','t']})

print(df)

   id  id_age product  rank result
0   1      30       A     1      x
1   1      30       B     2      y
2   1      30       C     3      z
3   2      23       A     3      p
4   2      23       B     1      q
5   2      23       C     2      r
6   3      29       A     2      s
7   3      29       B     1      t

想要的输出是

id  id_age    product       rank     result
0   1      30  [A, B, C]  [1, 2, 3]  [x, y, z]
1   2      23  [A, B, C]  [3, 1, 2]  [p, q, r]
2   3      29     [A, B]     [2, 1]     [s, t]

即每个 id 一行。我试图通过创建一个数据透视表来解决这个问题,但我不知道如何:

  1. 为不止一列(产品、排名、结果)重塑它
  2. 处理个体中不变的值 (id_age)
  3. 使最终数据框中的列采用列表格式(顺序很重要,排名中列表的第一个值对应于给定个人结果中列表的第一个值)。

感谢任何有关如何在此问题上取得进展的建议!

【问题讨论】:

  • 提醒一下,pandas 确实不支持在单元格中放置非标量条目。除非这是您流程的最后一步,否则您可能会遇到一些神秘的行为。

标签: python pandas pivot reshape


【解决方案1】:

对我来说工作:

df = df.groupby(['id','id_age']).agg(tuple).applymap(list)
print (df)
             product       rank     result
id id_age                                 
1  30      [A, B, C]  [1, 2, 3]  [x, y, z]
2  23      [A, B, C]  [3, 1, 2]  [p, q, r]
3  29         [A, B]     [2, 1]     [s, t]

【讨论】:

  • 对我来说,这会引发一个值错误:ValueError: No objects to concatenate。知道为什么会这样吗?
  • 你的熊猫版本是什么?这工作在pandas 0.21.0
  • 我有 0.19.2。我会更新并再次尝试您建议的解决方案,谢谢!
  • 不幸的是 agg(list) 没有实现 - 它引发了 error
  • 如果我或其他答案有帮助,请不要忘记accept 它 - 单击答案旁边的复选标记 () 将其从灰色切换为已填充。谢谢。
【解决方案2】:

我以前也不知道怎么弄...

df1=df.groupby(['id','id_age'])['product','rank','result'].apply(lambda x : x.T.values.tolist()).apply(pd.Series)
df1.columns=['product','rank','result']
df1
Out[126]: 
             product       rank     result
id id_age                                 
1  30      [A, B, C]  [1, 2, 3]  [x, y, z]
2  23      [A, B, C]  [3, 1, 2]  [p, q, r]
3  29         [A, B]     [2, 1]     [s, t]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-07
    • 2017-08-08
    • 2020-04-19
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    相关资源
    最近更新 更多