用 NaN 连接 Pandas 中的两列

Har*_*pta 3 python nan dataframe python-3.x pandas

我有一个这样的数据框

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
Run Code Online (Sandbox Code Playgroud)

我想合并这两列,但是如果 B 列是 NaN,则只保留 A 列。因此预期输出是

    ID  colA    colB    colC
0   ID1 A       D       A_D
1   ID2 B       NaN     B
2   ID3 C       E       C_E
Run Code Online (Sandbox Code Playgroud)

Pyg*_*irl 6

从 Datanovice 的回答中了解到这一点:

df['col_c'] = df[['colA', 'colB']].stack().groupby(level=0).agg('_'.join)
df
Run Code Online (Sandbox Code Playgroud)
    ID  colA    colB    col_c
0   ID1 A       D       A_D
1   ID2 B       NaN     B
2   ID3 C       E       C_E
Run Code Online (Sandbox Code Playgroud)


jez*_*ael 5

想法添加_到第二列_,因此在用空字符串替换缺失值后,不会_为缺失值添加:

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
Run Code Online (Sandbox Code Playgroud)

如果不确定缺失值的位置(incolAcolB):

df['colC'] = (df['colA'].fillna('') + '_' + df['colB'].fillna('')).str.strip('_')
Run Code Online (Sandbox Code Playgroud)

也可以分别测试每一列:

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
Run Code Online (Sandbox Code Playgroud)