Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/301.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_Conditional Statements_Large Data - Fatal编程技术网

基于多列值的具有重复键的两个大熊猫数据帧的条件合并/连接-Python

基于多列值的具有重复键的两个大熊猫数据帧的条件合并/连接-Python,python,pandas,merge,conditional-statements,large-data,Python,Pandas,Merge,Conditional Statements,Large Data,我来自R,老实说,这是使用R data.tables在一行中完成的最简单的事情,对于大型datatables,操作也相当快。但是我真的很难用Python实现它。前面提到的所有用例都不适合我的应用程序。目前的主要问题是Python解决方案中的内存使用,我将在下面解释 问题是:我有两个大数据帧df1和df2(每行大约50-100米),我需要根据两个条件将df2的两(或n)列合并到df1: 1) df1.id=df2.id(合并的常见情况) 2) df2.value_2A有趣的问题 看起来pandas

我来自R,老实说,这是使用R data.tables在一行中完成的最简单的事情,对于大型datatables,操作也相当快。但是我真的很难用Python实现它。前面提到的所有用例都不适合我的应用程序。目前的主要问题是Python解决方案中的内存使用,我将在下面解释

问题是:我有两个大数据帧df1和df2(每行大约50-100米),我需要根据两个条件将df2的两(或n)列合并到df1:

1) df1.id=df2.id(合并的常见情况)

2) df2.value_2A有趣的问题

看起来pandasql可能会做你想做的事情。请参阅: 有趣的问题

看起来pandasql可能会做你想做的事情。请参阅:

我已经试过了。它在进程中使用相同的内存量,而且速度非常慢(连接表中有多少行?选择了哪些字段?我已经尝试过了。它在过程中使用了相同的内存量,而且速度非常慢。:(连接表中有多少行?选择了哪些字段?
import numpy as np
import pandas as pd

df1 = pd.DataFrame({'id': [1,1,1,2,2,3], 'value_1': [2,5,7,1,3,4]})
df2 = pd.DataFrame({'id': [1,1,1,1,2,2,2,3], 'value_2A': [0,3,7,12,0,2,3,1], 'value_2B': [1,5,9,15,1,4,6,3]})

df1
Out[13]: 
   id  value_1
0   1        2
1   1        5
2   1        7
3   2        1
4   2        3
5   3        4

df2
Out[14]: 
   id  value_2A  value_2B
0   1         0         1
1   1         3         5
2   1         7         9
3   1        12        15
4   2         0         1
5   2         2         4
6   2         3         6
7   3         1         3

desired_output
Out[15]: 
   id  value_1  value_2A  value_2B
0   1        2       NaN       NaN
1   1        5       3.0       5.0
2   1        7       7.0       9.0
3   2        1       0.0       1.0
4   2        3       2.0       4.0
5   2        3       3.0       6.0
6   3        4       NaN       NaN
## This is NOT a solution because memory usage is just too large and 
## too many oprations deeming it extremely inefficient and slow at large scale

output = pd.merge(df1, df2, on='id', how='left')  ## output becomes very large in my case
output.loc[~((output['value_1'] >= output['value_2A']) & (output['value_1'] <= output['value_2B'])), ['value_2A', 'value_2B']] = np.nan
output = output.loc[~ output['value_2A'].isnull()]
output = pd.merge(df1, output, on=['id', 'value_1'], how='left')
## in R realm ##
require(data.table)
desired_output <- df2[df1, on=.(id, value_2A <= value_1, value_2B >= value_1)] #fast and easy operation