【问题标题】:Most efficient method to combine pandas DataFrames which have the same column value组合具有相同列值的熊猫数据帧的最有效方法
【发布时间】:2016-11-13 10:38:48
【问题描述】:

例如,我有两个数据框,其中包含一些相同的样本名称和不同的特征数据。

我想比较两个数据框中存在多少样本。

这里有数据

df1 df2

一个虚拟的方法来解决这个问题,我虽然有:

hit = 0
for i in range(0,len(df1),1):
    for j in range(0,len(df2),1):
        if df1.Sample_name.iloc[i] == df2.Sample_name.iloc[j]:
           hit+=1

虽然这个循环过程可能会浪费很多时间。有什么简单的技术可以解决吗?

此外,如何提取具有相同 sample_name 的每个数据帧的子集,并将它们的特征数据连接到一个新的数据帧中。

我已经尝试过 pd.concat(df1, df2, keys = 'Sample_name')

【问题讨论】:

  • 是否可以共享您的数据?
  • 在一个共享列上组合两个dfs称为join
  • 使用df1.Sample_name.isin(df2.Sample_name).sum() 应该可以有效地工作。
  • 你想要行交集的大小还是 DataFrames 上的点击总数?例如,帧df1 = df2 = pd.DataFrame({'a': [1, 1, 1]}) 应该产生 3 还是 9?如果是后一种情况,我想你想要 Divakar 的答案。

标签: python performance python-2.7 pandas join


【解决方案1】:

这是使用NumPy broadcasting 获取hit 值的矢量化方法-

np.count_nonzero(df1.Sample_name.values[:,None] == df2.Sample_name.values)

【讨论】:

  • 一些初步测试表明这比isin快得多
  • @juanpa.arrivillaga:你测试它的列有多大?
  • @ajcr 小。我想随着它们变大,相对性能会变得更差,我只是目前没有足够的精力来正确测试它。
【解决方案2】:

您应该通过标识列作为index 加入您的表,然后使用pandas.DataFrame.apply 来应用您现在的列属性之间的比较。

【讨论】:

    猜你喜欢
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2021-11-16
    • 2023-01-24
    • 1970-01-01
    • 2021-11-20
    • 2018-09-04
    相关资源
    最近更新 更多