[英]Merge two columns in the same pandas dataframe
我有一个必须合并多对列的数据框。 这些列包含互斥数据。 也就是说,如果列A中有一个值,则列B中该行的值将为空。
df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', '', 'A2', ''],
'B': ['', 'B1', '', 'B3'],
'C': ['C1','C2','',''],
'D': ['','','D3','D4']})
所以我有这样的事情:
A B C D key
0 A0 C1 K0
1 B1 C2 K1
2 A2 D3 K2
3 B3 D4 K3
我想合并A列和B列,以便所有值最终都在A列中。我还希望以C和D形式进行此操作,同时保持索引和其他任何列(如Key)不变。 我可以分多个步骤进行操作。 我不需要同时进行AB合并和CD合并。 理想情况下,我最终得到:
A C key
0 A0 C1 K0
1 B1 C2 K1
2 A2 D3 K2
3 B3 D4 K3
我已经尝试过df = df.A.combine_first(df.B)
但那无济于事。
这是使用zip来匹配每两列的解决方案
li = zip(df.columns[0::2],df.columns[1::2])
#[('A', 'B'), ('C', 'D')]
# I assume columns are pairs and end up with lenght as odd number with additional column.
# If you want to ignore last column manually you can use
# li = zip(df.columns[0:-1:2],df.columns[1:-1:2]) # slice `start:end:step`
temp = pd.DataFrame({i :df[i]+df[j] for i,j in li})
ndf = pd.concat([temp,df['key']],1)
# A C key
# 0 A0 C1 K0
# 1 B1 C2 K1
# 2 A2 D3 K2
# 3 B3 D4 K3
如果您可以先将空字符串转换为NaN,则可以尝试通过以下方式使用Series.fillna :
import numpy as np
df = df.replace('', np.nan)
df.A = df.A.fillna(df.B)
df.C = df.C.fillna(df.D)
这使:
df
A B C D key
0 A0 NaN C1 NaN K0
1 B1 B1 C2 NaN K1
2 A2 NaN D3 D3 K2
3 B3 B3 D4 D4 K3
这将用B列中的值填充A列中的缺失值,然后将结果序列设置为df
A列。 我们可以使用循环将这种想法扩展到多列的情况:
l_cols = df.columns[0::2] # Left columns in the pairs
r_cols = df.columns[1::2] # Right columns in the pairs
# Go through each pair
for l, r in zip(l_cols, r_cols):
df[l] = df[r].fillna(df[r])
可以使用以下命令从输出中排除用于合并的列:
df = df.drop(r_cols, axis=1)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.