Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.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_Merge_Concat - Fatal编程技术网

Python 将两个数据帧与一些公共列合并,其中公共列的组合需要是一个自定义函数

Python 将两个数据帧与一些公共列合并,其中公共列的组合需要是一个自定义函数,python,pandas,merge,concat,Python,Pandas,Merge,Concat,我的问题非常类似于,但它不能回答我的需要 假设我有两个数据帧,例如(请注意,数据帧内容可以是浮点数,而不是布尔数): 正确的 左边 正如您所看到的,它们具有相同的索引,其中一列是公共的。在现实生活中,可能会有更多的公共列,如1.0或其他尚未定义的数字,并且每侧都有更多的唯一列。 我需要组合这两个数据帧,以便保留所有唯一的列,并使用一个特定的函数(例如布尔函数或本例中的布尔函数)组合公共列,同时两个数据帧的索引始终相同 因此,结果应该是: 结果 在现实生活中,将有两个以上的数据帧需要组合,但它们可

我的问题非常类似于,但它不能回答我的需要

假设我有两个数据帧,例如(请注意,数据帧内容可以是浮点数,而不是布尔数):

正确的 左边 正如您所看到的,它们具有相同的索引,其中一列是公共的。在现实生活中,可能会有更多的公共列,如1.0或其他尚未定义的数字,并且每侧都有更多的唯一列。 我需要组合这两个数据帧,以便保留所有唯一的列,并使用一个特定的函数(例如布尔函数或本例中的布尔函数)组合公共列,同时两个数据帧的索引始终相同

因此,结果应该是:

结果 在现实生活中,将有两个以上的数据帧需要组合,但它们可以依次组合成一个空的第一个数据帧


我觉得pandas.combine可能会起作用,但我无法从文档中找到答案。任何人都会对如何在一个或多个步骤中实现这一点提出建议。

您可以连接数据帧,然后按列名分组以对类似命名的列应用一个操作:在这种情况下,您可以不用求和,然后将类型转换回bool以获得
操作

import pandas as pd

df = pd.concat([left, right], 1)
df.groupby(df.columns, 1).sum().astype(bool)
输出:
如果您需要了解如何以不太区分大小写的方式执行此操作,那么再次只需按列分组,并通过
axis=1

df = pd.concat([left, right], 1)
df.groupby(df.columns, 1).apply(lambda x: x.any(1))
#        0.0   0.5    0.7
#12.5   True  True   True
#14.0   True  True  False
#15.5  False  True  False

此外,还可以定义自定义组合函数。这是一个将左帧的两倍添加到右帧的四倍的方法。如果只有一列,则返回左帧的2x

样本数据 左:

对:

      0.7  0.5
12.5    4    2
14.0    4   -1
15.5    5    5
代码 输出:
最后,如果希望以连续的方式执行此操作,则应使用
reduce
。在这里,我将把5
DataFrames
与上述函数结合起来。(对于示例,我将重复右帧4x)


我将通过几个步骤来完成:推导公共列,将组合函数应用于这两个列,然后添加非公共列。对于两个以上的数据帧,您可以将这些步骤应用于第一个数据帧,同时循环其他数据帧。这听起来合乎逻辑吗?很好。。。。但是,如果组合函数不是简单的布尔或,并且数据帧包含数字而不是布尔,该怎么办?函数可以是通用的,但总是对称的:f(右,左)@user10472446请参阅更新。您可以定义自己的函数,然后与
reduce
结合使用,通过提供要加入的
数据帧列表,您可以将该函数应用于每个连续的连接。非常感谢,这就是我一直在寻找的!
        0.0   0.5    0.7
12.5   True  True   True
14.0   True  True  False
15.5  False  True  False
import pandas as pd

df = pd.concat([left, right], 1)
df.groupby(df.columns, 1).sum().astype(bool)
        0.0   0.5    0.7
12.5   True  True   True
14.0   True  True  False
15.5  False  True  False
df = pd.concat([left, right], 1)
df.groupby(df.columns, 1).apply(lambda x: x.any(1))
#        0.0   0.5    0.7
#12.5   True  True   True
#14.0   True  True  False
#15.5  False  True  False
      0.0  0.5
12.5    1   11
14.0    2   17
15.5    3   17
      0.7  0.5
12.5    4    2
14.0    4   -1
15.5    5    5
def my_func(x):
    try:
        res = x.iloc[:, 0]*2 + x.iloc[:, 1]*4
    except IndexError:
        res = x.iloc[:, 0]*2
    return res

df = pd.concat([left, right], 1)
df.groupby(df.columns, 1).apply(lambda x: my_func(x))
      0.0  0.5  0.7
12.5    2   30    8
14.0    4   30    8
15.5    6   54   10
from functools import reduce

def my_comb(df_l, df_r, func):
    """ Concatenate df_l and df_r along axis=1. Apply the
    specified function.
    """
    df = pd.concat([df_l, df_r], 1)
    return df.groupby(df.columns, 1).apply(lambda x: func(x))

reduce(lambda dfl, dfr: my_comb(dfl, dfr, func=my_func), [left, right, right, right, right])
#      0.0  0.5  0.7
#12.5   16  296  176
#14.0   32  212  176
#15.5   48  572  220