大熊猫从两个数据框中聚合数据

时间:2018-06-25 13:26:41

标签: python pandas

我有两个熊猫数据帧,其中一些索引和某些列名称是公共的(例如与公共数量有关的部分重叠的时间序列)。

我需要将这两个数据帧合并到一个包含所有索引和每个索引的所有值的单个数据帧中,并在两个数据帧中均出现索引列组合的情况下,将左侧(右侧)的值保持不变。 / p>

合并和连接方法都无济于事,因为合并方法将复制我不需要的信息,并且连接会导致相同的问题。

什么是获得所需结果的有效方法?

编辑: 例如,如果我有两个数据帧

df1 = pd.DataFrame({
'C1' : [1.1, 1.2, 1.3],
'C2' : [2.1, 2.2, 2.3],
'C3': [3.1, 3.2, 3.3]},
index=['a', 'b', 'c'])

df2 = pd.DataFrame({
'C3' : [3.1, 3.2, 33.3],
'C4' : [4.1, 4.2, 4.3]},
index=['b', 'c', 'd'])

我需要的是一种允许我创建的方法:

merged = pd.DataFrame({
'C1': [1.1, 1.2, 1.3, 'nan'],
'C2': [2.1, 2.2, 2.3, 'nan'],
'C3': [3.1, 3.2, 3.3, 33.3], 
'C4': ['nan', 4.1, 4.2, 4.3]},
index=['a', 'b', 'c', 'd'])

2 个答案:

答案 0 :(得分:2)

这是三种可能性:

  • 使用concat/groupby:首先垂直连接两个DataFrame。然后按索引分组,然后选择每组中的第一行。

  • 使用combine_first:创建一个新索引,该索引是df1df2的并集。使用新索引重新索引df1。然后使用combine_firstdf2中的值填写NaN。

  • 使用手动构造:我们可以使用df2.index.difference(df1.index)来确切地找到需要添加到df1的行。因此,我们可以从df2中手动选择这些行,并将它们连接到df1上。

对于小型DataFrame,using_concat更快。对于较大的DataFrame,using_combine_first似乎比其他选项要快:

import numpy as np
import pandas as pd
import perfplot

def make_dfs(N):
    df1 = pd.DataFrame(np.random.randint(10, size=(N,2)))
    df2 = pd.DataFrame(np.random.randint(10, size=(N,2)), index=range(N//2,N//2 + N))
    return df1, df2

def using_concat(dfs):
    df1, df2 = dfs
    result = pd.concat([df1,df2], sort=False)
    n = result.index.nlevels
    return result.groupby(level=range(n)).first()

def using_combine_first(dfs):
    df1, df2 = dfs
    index = df1.index.union(df2.index)
    result = df1.reindex(index)
    result = result.combine_first(df2)
    return result

def using_manual_construction(dfs):
    df1, df2 = dfs
    index = df2.index.difference(df1.index)
    cols = df2.columns.difference(df1.columns)
    result = pd.concat([df1, df2.loc[index]], sort=False)
    result.loc[df2.index, cols] = df2
    return result

perfplot.show(
    setup=make_dfs,
    kernels=[using_concat, using_combine_first, 
             using_manual_construction],
    n_range=[2**k for k in range(5,21)],
    logx=True,
    logy=True,
    xlabel='len(df)')

enter image description here

答案 1 :(得分:0)

没有看到您的代码,我只能给出一个通用答案:

要合并2个数据框,请使用

df3 = pd.merge(df1, df2, how='right', on=('col1', 'col2'))

a.merge(b, how='right', on=('c1', 'c2'))