想象两个数据框:
X = pd.DataFrame([[1,2],[3,4],[5,6]], columns=["a", "b"])
Y = pd.DataFrame([10,20,30], columns=["a"])
>>> X
a b
0 1 2
1 3 4
2 5 6
>>> Y
a
0 10
1 20
2 30
总的来说,我希望我的最终输出是这样的:
a_X b_X a_Y b_Y sum_a sum_b
0 1 2 10 NaN 11 2
1 3 4 20 NaN 23 4
2 5 6 30 NaN 35 6
我尝试这样做:
merged = X.join(Y, lsuffix="_X", rsuffix="_Y")
merged['sum_a'] = merged['a_X'] + merged['a_Y'] # works
merged['sum_b'] = merged['b_X'] + merged['b_Y'] # doesn't work
显然 sum_b 列将失败,因为 Y 集中没有 b 列。它可能存在,但不一定存在,我的数据集没有任何保证。我似乎无法使用内置联接来添加“NaN”列。
最佳答案
与 pd.concat
连接 -
k = ['X', 'Y']
df = pd.concat([X, Y], keys=k, axis=1)
df
X Y
a b a
0 1 2 10
1 3 4 20
2 5 6 30
生成 MultiIndex 并用它来重新索引 -
idx = pd.MultiIndex.from_product([k, df.columns.levels[1].unique()])
df = df.reindex(columns=idx)
df
X Y
a b a b
0 1 2 10 NaN
1 3 4 20 NaN
2 5 6 30 NaN
重新设置列名称 -
df.columns = df.columns.map('_'.join)
df
X_a X_b Y_a Y_b
0 1 2 10 NaN
1 3 4 20 NaN
2 5 6 30 NaN
现在,您可以按后缀分组并求和 -
v = df.groupby(by=lambda x: x.split('_')[1], axis=1).sum().add_prefix('sum_')
v
sum_a sum_b
0 11.0 2.0
1 23.0 4.0
2 35.0 6.0
将其与原始内容连接起来:
pd.concat([df, v], 1)
X_a X_b Y_a Y_b sum_a sum_b
0 1 2 10 NaN 11.0 2.0
1 3 4 20 NaN 23.0 4.0
2 5 6 30 NaN 35.0 6.0
关于python - Pandas - 将缺失的列连接为 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47797150/