我有一个具有不同数据类型的数据框,如下所示。
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的形状不是正方形,则无法正常工作。
最快的方法是什么?
答案 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)