这主要是这个问题的后续问题。
Combine Pandas data frame column values into new column
我希望将日期框架的某些列(不是全部)组合到一个列中,并选择以特定的优先顺序使用哪些数据,并忽略休息。
例如我有这个
size
给出了
df=pd.DataFrame({'A': ['alpha','beta', np.nan, np.nan],
'B':['alpha_1',np.nan, np.nan, 'delta_1'],
'C': [np.nan,'beta_2', 'gamma_2', 'delta_2']})
我希望将它们组合在一起,以便首先选择 A B C
0 alpha alpha_1 NaN
1 beta NaN beta_2
2 NaN NaN gamma_2
3 NaN delta_1 delta_2
中的值,如果是column A
或NaN
,它会在null
中查找值,如果最后没有进入column B
所以column C
中的最终输出就像
Column D
我可以按照解决方案中的建议做 A B C D
0 alpha alpha_1 NaN alpha
1 beta NaN beta_2 beta
2 NaN NaN gamma_2 gamma_2
3 NaN delta_1 delta_2 delta_1
但我之前想的是我应该确保每一行只有df.fillna('').sum(axis=1)
值。
我正在尝试使用每列上的non NaN
进行布尔屏蔽,但无法在此进行太多进展。任何帮助都会很棒。
答案 0 :(得分:3)
In [338]: df['D'] = df.T.bfill().iloc[0]
In [339]: df
Out[339]:
A B C D
0 alpha alpha_1 NaN alpha
1 beta NaN beta_2 beta
2 NaN NaN gamma_2 gamma_2
3 NaN delta_1 delta_2 delta_1
答案 1 :(得分:3)
bfill
的解决方案与method='bfill'
fillna
相同
df['D'] = df.bfill(axis=1).iloc[:, 0]
print (df)
A B C D
0 alpha alpha_1 NaN alpha
1 beta NaN beta_2 beta
2 NaN NaN gamma_2 gamma_2
3 NaN delta_1 delta_2 delta_1
df['D'] = df.fillna(method='bfill',axis=1).iloc[:, 0]
print (df)
A B C D
0 alpha alpha_1 NaN alpha
1 beta NaN beta_2 beta
2 NaN NaN gamma_2 gamma_2
3 NaN delta_1 delta_2 delta_1
first_valid_index
和apply
的另一种解决方案:
df['D'] = df.apply(lambda x: x[x.first_valid_index()], axis=1)
print (df)
A B C D
0 alpha alpha_1 NaN alpha
1 beta NaN beta_2 beta
2 NaN NaN gamma_2 gamma_2
3 NaN delta_1 delta_2 delta_1