首页 > 解决方案 > 熊猫数据框的行到列的值

问题描述

我有一个具有不同数据类型的数据框,如下所示。

df:
    A     B     C
0   True  X     1
1   False X     2
2   False Y     3
3   True  Y     4
4   False X     5
5   True  X     6
6   True  Y     7
7   False Y     8

我需要从 C 中获取值并将它们放在 B 中的 X 和 Y 的不同列中,在 A 中为真。所需的 df 看起来像这样:

df_desired:
    X_1    X_2    Y_1    Y_2
0   1      6      4      7

我能够使用以下代码对 df 进行分组以获取 B 中 X 和 Y 的 A 中为真的值:

df1 = df.groupby(by=['A', 'B'])['C'].apply(list).reset_index()
df1:
    B   A       C
0   X   False   [2, 5]
1   X   True    [1, 6]
2   Y   False   [3, 8]
3   Y   True    [4, 7]

在另一个数据框中分配 True 列给了我一个提示,即我走在正确的道路上,但似乎我陷入了获取所需数据框的最后一步。

df2['X'] = df1[df1['A']].iloc[0]['C']
df2['Y'] = df1[df1['A']].iloc[1]['C']
df2:
    X   Y
0   1   4
1   6   7

我试过df2。转置,但如果 df2 的形状不是正方形,它就不能特别工作。

最快的方法是什么?

标签: pythonpandas

解决方案


你可以做:

d = df.loc[df['A']]
c = d['B'] + '_' + d.groupby('B').cumcount().add(1).astype(str)
d = pd.DataFrame([d['C'].values], columns=c).sort_index(1)

或者,

d = df.loc[df['A'], ['B', 'C']].copy()
d['B'] += '_' + d.groupby('B').cumcount().add(1).astype(str)
d = d.set_index('B').T.reset_index(drop=True).sort_index(1)

print(d)

   X_1  X_2  Y_1  Y_2
0    1    6    4    7

推荐阅读