python - Pandas - 将缺失的列连接为 NaN

标签 python pandas dataframe

想象两个数据框:

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/

相关文章:

python - 使用正则表达式将数据提取到 Pandas 中的不同列

python - Pandas 在 BytesIO 中将 df 存储到 csv

python - df.iloc 未在 For 循环中赋值? ( Pandas )

r - 根据上一行更改列值

python - 从多个系列创建 DataFrame

python - Python 中的 FTP_ASCII

python - python请求中的OpenSSL错误

python - 在 Python Pandas 中将 GZIP 压缩应用于 CSV

python - Pandas 爆炸指数

python - 为什么在 Python 目录中创建 postscript 文件?