Python 基于布尔函数的数据帧合并

Python 基于布尔函数的数据帧合并,python,pandas,dataframe,merge,Python,Pandas,Dataframe,Merge,我正在寻找一种有效的方法来合并两个panda数据帧,该方法基于一个函数,该函数将两个数据帧中的列作为输入,并返回True或False。例如,假设我有以下“表格”: 我想在第一列的和是偶数的每一行上加入df1和df2。生成的表将是 1 5 df_3 = 2 4 2 6 3 5 请将其视为一般问题,而不是仅返回df_3的任务。解决方案应接受验证列组合并返回True或False的任何函数 THX Lazloo这是一个基本的解决方案,但如果您正在处理大型数据帧

我正在寻找一种有效的方法来合并两个panda数据帧,该方法基于一个函数,该函数将两个数据帧中的列作为输入,并返回True或False。例如,假设我有以下“表格”:

我想在第一列的和是偶数的每一行上加入df1和df2。生成的表将是

       1 5
df_3 = 2 4
       2 6
       3 5
请将其视为一般问题,而不是仅返回df_3的任务。解决方案应接受验证列组合并返回True或False的任何函数


THX Lazloo

这是一个基本的解决方案,但如果您正在处理大型数据帧,则效率不高

df_1.index *= 0
df_2.index *= 0
df = df_1.join(df_2, lsuffix='_2')
df = df[df.sum(axis=1) % 2 == 0]
编辑, 这里有一个更好的解决方案

df_1.index = df_1.iloc[:,0] % 2
df_2.index = df_2.iloc[:,0] % 2
df = df_1.join(df_2, lsuffix='_2')

您可以使用广播或
outer
功能来比较所有行。当长度变大时,您将遇到问题

import pandas as pd
import numpy as np

def validation(a, b):
    """a,b : np.array"""
    arr = np.add.outer(a, b)     # How to combine rows
    i,j = np.where(arr % 2 == 0) # Condition

    return pd.DataFrame(np.stack([a[i], b[j]], axis=1))

validation(df_1[0].to_numpy(), df_2[0].to_numpy())

   0  1
0  1  5
1  2  4
2  2  6
3  3  5

在这种特殊情况下,您可能会利用这样一个事实,即偶数在添加到偶数时保持奇偶性,而奇数在添加到奇数时改变奇偶性,因此请定义该列并在此列上合并

df_1['parity'] = df_1[0]%2
df_2['parity'] = df_2[0]%2

df_3 = df_1.merge(df_2, on='parity')

   0_x  parity  0_y
0    1       1    5
1    3       1    5
2    2       0    4
3    2       0    6

您可以在奇偶校验时使用
merge

(df_1.assign(parity=df_1[0]%2)
     .merge(df_2.assign(parity=df_2[0]%2), on='dummy')
     .drop('parity', axis=1)
)
输出:

   0_x  0_y
0    1    5
1    3    5
2    2    4
3    2    6
   0_x  0_y
0    1    5
1    3    5
2    2    4
3    2    6