以特定的优先顺序将pandas列合并到新列中

时间:2017-03-10 12:21:37

标签: python pandas dataframe

这主要是这个问题的后续问题。

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 ANaN,它会在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进行布尔屏蔽,但无法在此进行太多进展。任何帮助都会很棒。

2 个答案:

答案 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_indexapply的另一种解决方案:

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