用NaN连接熊猫中的两列

时间:2019-07-19 12:17:34

标签: python python-3.x pandas dataframe nan

我有一个这样的数据框

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

3 个答案:

答案 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

如果不确定哪里缺少值(在colAcolB中):

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