在pandas中合并两列,其中包含NaN。

10
我有一个如下所示的数据表。
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个回答

11

_添加到第二列和_,这样在用空字符串替换缺失值之后,对于缺失值不会添加_:

想法是在第二列和_中添加_,这样在用空字符串替换缺失值时,对于缺失值不会添加_:

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

6

这是我从Datanovice的答案中学到的:

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

3

使用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)

输出:

    ID colA colB colC
0  ID1    A    D  A_D
1  ID2    B  NaN    B
2  ID3    C    E  C_E

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接