在熊猫中,如何水平连接然后删除冗余列

新手上路,请多包涵

假设我有两个数据框。

DF1: col1, col2, col3,

DF2:列 2、列 4、列 5

如何水平连接两个数据帧并具有 col1、col2、col3、col4 和 col5?现在,我正在做 pd.concat([DF1, DF2], axis = 1) 但它最终有两个 col2。假设两个 col2 中的所有值都相同,我想只有一列。

原文由 Jun Jang 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 355
2 个回答

删除重复项应该有效。因为 drop_duplicates 仅适用于索引,所以我们需要转置 DF 以删除重复项并将其转置回去。

 pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T

原文由 Allen Qin 发布,翻译遵循 CC BY-SA 3.0 许可协议

Use difference for columns from DF2 which are not in DF1 and simple select them by [] :

 DF1 = pd.DataFrame(columns=['col1', 'col2', 'col3'])
DF2 = pd.DataFrame(columns=['col2', 'col4', 'col5'])

DF2 = DF2[DF2.columns.difference(DF1.columns)]
print (DF2)
Empty DataFrame
Columns: [col4, col5]
Index: []

print (pd.concat([DF1, DF2], axis = 1))
Empty DataFrame
Columns: [col1, col2, col3, col4, col5]
Index: []

时间

 np.random.seed(123)

N = 1000
DF1 = pd.DataFrame(np.random.rand(N,3), columns=['col1', 'col2', 'col3'])
DF2 = pd.DataFrame(np.random.rand(N,3), columns=['col2', 'col4', 'col5'])

DF2['col2'] = DF1['col2']

In [408]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T)
10 loops, best of 3: 122 ms per loop

In [409]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1))
1000 loops, best of 3: 979 µs per loop

 N = 10000:
In [411]: %timeit (pd.concat([DF1, DF2], axis = 1).T.drop_duplicates().T)
1 loop, best of 3: 1.4 s per loop

In [412]: %timeit (pd.concat([DF1, DF2[DF2.columns.difference(DF1.columns)]], axis = 1))
1000 loops, best of 3: 1.12 ms per loop

原文由 jezrael 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题