Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫从两个数据帧聚合数据_Python_Pandas - Fatal编程技术网

Python 熊猫从两个数据帧聚合数据

Python 熊猫从两个数据帧聚合数据,python,pandas,Python,Pandas,我有两个panda数据帧,有一些索引和一些共同的列名(比如与公共数量相关的部分重叠的时间序列) 我需要将这两个数据帧合并到一个包含所有索引和每个索引的所有值的数据帧中,保留左(右)数据帧的值,以防索引列组合出现在两个数据帧中 合并和连接方法都没有帮助,因为合并方法会复制我不需要的信息,而连接会导致相同的问题 获得我需要的结果的有效方法是什么 编辑: 例如,如果我有两个数据帧 df1 = pd.DataFrame({ 'C1' : [1.1, 1.2, 1.3], 'C2' : [2.1, 2.2

我有两个panda数据帧,有一些索引和一些共同的列名(比如与公共数量相关的部分重叠的时间序列)

我需要将这两个数据帧合并到一个包含所有索引和每个索引的所有值的数据帧中,保留左(右)数据帧的值,以防索引列组合出现在两个数据帧中

合并和连接方法都没有帮助,因为合并方法会复制我不需要的信息,而连接会导致相同的问题

获得我需要的结果的有效方法是什么

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

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个数据帧,请使用

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


这里有三种可能性:

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

  • 首先使用
    combine\u
    :创建一个新索引,它是
    df1
    df2
    的并集。使用新索引重新编制df1的索引。然后先使用
    combine_
    df2
    中的值填入NAN

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

对于小数据帧,
使用_concat
更快。对于较大的数据帧,
首先使用_combine_
似乎比其他选项稍快一些:

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)')

向我们展示一些数据和/或代码。
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)')