添加来自不同 table 和 Pandas 的属性

Adding attribute from the different table with Pandas

我正在使用 Pandas 处理 table。

[table1]
  sample1 sample2 sample3
A 11      22      33
B 1       2       3

[table2]
  sample3 sample4 sample2
D 333     444     222

[Result]
  sample1 sample2 sample3
A 11      22      33
B 1       2       3
D NaN     222     333

我有两个 table,考虑到列名,我想将行 D(属于 table 2)添加到 table 1。如果table 1中的列存在于table 2中,则将D对应的值添加到table 1中,如样本2和样本3。如果table在table2中不存在像样本1,D的值设置为NaN或忽略。

有什么简单的方法可以用 Pandas 做到这一点吗?

我想你可以使用 concat and then remove column sample4 by drop:

print (pd.concat([table1, table2]).drop('sample4', axis=1))
   sample1  sample2  sample3
A     11.0       22       33
B      1.0        2        3
D      NaN      222      333

您可以使用 intersection 选择 DataFrames 中的列,然后通过这些列连接 table2 的子集:

print (table2.columns.intersection(table1.columns))
Index(['sample2', 'sample3'], dtype='object')

print (pd.concat([table1,table2[table2.columns.intersection(table1.columns)]]))
   sample1  sample2  sample3
A     11.0       22       33
B      1.0        2        3
D      NaN      222      333

然后如果需要删除带有 NaN 的行,请使用 dropna:

print (pd.concat([table1, table2]).drop('sample4', axis=1).dropna())
   sample1  sample2  sample3
A     11.0       22       33
B      1.0        2        3

您可以概括 jezrael 的 by first subselecting columns from table2 which are in table1. This is quite neatly done using 。这也避免了形成一个潜在的巨大的临时数据框,其中包含来自两个数据框的列。示例:

import numpy as np
import pandas as pd

table1 = pd.DataFrame([[11, 22, 33], [1, 2, 3]], index=list('AB'), columns=['sample1', 'sample2', 'sample3'])
table2 = pd.DataFrame([[333, 444, 222]], index=['D'], columns=['sample3', 'sample4', 'sample2'])

# Sub-select columns...
cols_in_table1 = table2.columns[np.in1d(table2.columns, table1.columns)]

# ... and concatenate.
results = pd.concat((table1, table2[cols_in_table1]))

print(results)

打印:

   sample1  sample2  sample3
A     11.0       22       33
B      1.0        2        3
D      NaN      222      333