添加来自不同 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
我正在使用 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 的 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