用 NaN 连接 pandas 中的两列
Concatenate two columns in pandas with 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
想法是将 _
添加到带有 _
的第二列,因此在用空字符串替换缺失值后不会添加 _
缺失值:
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
使用 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
从 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
我有一个这样的数据框
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
想法是将 _
添加到带有 _
的第二列,因此在用空字符串替换缺失值后不会添加 _
缺失值:
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
使用 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
从 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