【问题标题】:Python pandas, how to transform a dataframe? [duplicate]Python pandas,如何转换数据框? [复制]
【发布时间】:2020-08-31 04:35:29
【问题描述】:

如果我有一个数据框:

>>> import pandas as pd
>>> df = pd.DataFrame({'grp':['A', 'A', 'B', 'B', 'B'], 'pos' : [1, 2, 1, 2, 3], 'desc1' : ['X1', 'X2', 'Y1', 'Y2', 'Y3'], 'desc2' : ['A1', 'A2', 'A1', 'A2', 'A3']})
>>> df['desc'] = df.desc1 + ' (' + df.desc2 + ')'
>>> df = df.drop(columns=['desc1', 'desc2'])
>>> df
  grp  pos     desc
0   A    1  X1 (A1)
1   A    2  X2 (A2)
2   B    1  Y1 (A1)
3   B    2  Y2 (A2)
4   B    3  Y3 (A3)
>>>

我想将 i 转换为以下数据框:

  grp     pos1     pos2     pos3
0   A  X1 (A1)  X2 (A2)     None
1   B  Y1 (A1)  Y2 (A2)  Y3 (A3)

我想按“grp”对所有内容进行分组,并且每个位置在列单元格中都有 desc。 组具有可变数量的位置。 如何进行改造?

问候。

【问题讨论】:

标签: python pandas


【解决方案1】:

IIUCpd.crosstab

df1 = pd.crosstab(df.grp,df.pos,df.desc,aggfunc=lambda x : x)\
                .add_prefix('pos')\
                .reset_index()\
                .rename_axis(None,axis=1)

print(df1)
  grp     pos1     pos2     pos3
0   A  X1 (A1)  X2 (A2)      NaN
1   B  Y1 (A1)  Y2 (A2)  Y3 (A3)

【讨论】:

  • 它有效。 lambda 函数的有趣用法。谢谢。
【解决方案2】:

或者你可以使用 groupby 和 unstack 来解决它:

import pandas as pd
df = pd.DataFrame({'grp':['A', 'A', 'B', 'B', 'B'], 'pos' : [1, 2, 1, 2, 3], 'desc1' : ['X1', 'X2', 'Y1', 'Y2', 'Y3'], 'desc2' : ['A1', 'A2', 'A1', 'A2', 'A3']})
df['desc'] = df.desc1 + ' (' + df.desc2 + ')'
df = df.drop(columns=['desc1', 'desc2'])

df1 = df.groupby(['grp', 'pos'])['desc'].first().unstack('pos')
print(df1)
#Output:
pos        1        2        3
grp                           
A    X1 (A1)  X2 (A2)      NaN
B    Y1 (A1)  Y2 (A2)  Y3 (A3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-11
    • 2021-03-10
    • 2021-10-15
    • 2014-08-19
    • 2015-04-04
    • 2018-05-02
    • 2020-06-17
    • 2021-02-12
    相关资源
    最近更新 更多