我有一个这样的数据框
df = (pd.DataFrame({'ID': ['ID1', 'ID2', 'ID3'],
'colA': ['A', 'B', 'C'],
'colB': ['D', np.nan, 'E']}))
df
ID colA colB
0 ID1 A D
1 ID2 B NaN
2 ID3 C E
我想合并两列,但是如果列B为NaN,则仅保留列A。因此,预期输出为
ID colA colB colC
0 ID1 A D A_D
1 ID2 B NaN B
2 ID3 C E C_E
答案 0 :(得分:3)
想法是将_
添加到_
的第二列中,因此在用空字符串替换缺失值之后,不会为缺失值添加_
:
df['colC'] = df['colA'] + ('_' + df['colB']).fillna('')
print (df)
ID colA colB colC
0 ID1 A D A_D
1 ID2 B NaN B
2 ID3 C E C_E
如果不确定哪里缺少值(在colA
或colB
中):
df['colC'] = (df['colA'].fillna('') + '_' + df['colB'].fillna('')).str.strip('_')
也可以分别测试每一列:
m1 = df['colA'].isna()
m2 = df['colB'].isna()
df['colC'] = np.select([m1, m2, m1 & m2],
[df['colB'], df['colA'], np.nan],
default=df['colA'] + '_' + df['colB'])
print (df)
ID colA colB colC
0 ID1 A D A_D
1 ID2 B NaN B
2 ID3 NaN E E
3 ID4 NaN NaN NaN
答案 1 :(得分:1)
使用Series.str.cat()访问器。
sep='_'
-放在两个字符串之间的分隔符。na_rep=''
-要忽略NaN
的值,它是None或要替换为空值的字符串值。 str.replace('_$', '')
-删除下划线。例如。
import pandas as pd
import numpy as np
df = (pd.DataFrame({'ID': ['ID1', 'ID2', 'ID3'],
'colA': ['A', 'B', 'C'],
'colB': ['D', np.nan, 'E']}))
df['colC']= df.colA.str.cat(df.colB,sep="_",na_rep='').str.replace('_$', '')
print(df)
O / P:
ID colA colB colC
0 ID1 A D A_D
1 ID2 B NaN B
2 ID3 C E C_E
答案 2 :(得分:1)
从Datanovice的answer学到了这一点:
df['col_c'] = df[['colA', 'colB']].stack().groupby(level=0).agg('_'.join)
df
ID colA colB col_c
0 ID1 A D A_D
1 ID2 B NaN B
2 ID3 C E C_E