大熊猫数据框的行到列的值

时间:2020-09-27 17:09:24

标签: python pandas

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

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中为True的不同列中。所需的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的形状不是正方形,则无法正常工作。

最快的方法是什么?

3 个答案:

答案 0 :(得分:2)

您可以这样做:

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

答案 1 :(得分:1)

我认为您需要:

df2 = df.loc[df['A']]
new_df = df2.pivot_table(colums=['B', df2.groupby('B').cumcout().add(1)], values ='C', aggfunc = 'first')
new_df = new_df.set_axis([f'{x}_{y}' for x, y in new_df.columns], axis = 1)

答案 2 :(得分:0)

import pandas as pd
a = pd.DataFrame([[True,'X',1],[False,'X',2],[False,'Y',3],[True,'Y',4],[False, 'X' ,5],[True,'X',6],[True,'Y',7],[False ,'Y',8]],columns=["A","B","C"])
a=pd.pivot_table(a, values='C', index=['B'],columns=["A"],observed=True,aggfunc=list,)

通过单击此处输出:
OUTPUT by clicking here