Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.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 - Fatal编程技术网

Python 合并条件聚合

Python 合并条件聚合,python,pandas,merge,Python,Pandas,Merge,我想基于组合键合并两个数据帧。考虑到键,第二个数据帧具有重复的行。请注意,键在第一个数据帧中也不是唯一的,因为实际数据中实际上还有许多列。我需要在第二个数据帧上与聚合(产品)值合并,但在日期上有一个条件。要聚合的行的日期应低于从第一个数据帧开始的行的日期 以下是一个例子: df1 = pd.DataFrame({ 'Code': ['Code1', 'Code1', 'Code1', 'Code2', 'Code3', 'Code4'], 'SG': ['SG1', 'SG1',

我想基于组合键合并两个数据帧。考虑到键,第二个数据帧具有重复的行。请注意,键在第一个数据帧中也不是唯一的,因为实际数据中实际上还有许多列。我需要在第二个数据帧上与聚合(产品)值合并,但在日期上有一个条件。要聚合的行的日期应低于从第一个数据帧开始的行的日期

以下是一个例子:

df1 = pd.DataFrame({
    'Code': ['Code1', 'Code1', 'Code1', 'Code2', 'Code3', 'Code4'],
    'SG': ['SG1', 'SG1', 'SG1', 'SG2', 'SG3', 'SG3'],
    'Date':
    ['2020-02-01', '2020-02-01', '2020-03-01', '2020-01-01', '2020-02-01', '2020-02-01']
})



print(df1)
    Code   SG        Date
0  Code1  SG1  2020-02-01
1  Code1  SG1  2020-02-01
2  Code1  SG1  2020-03-01
3  Code2  SG2  2020-01-01
4  Code3  SG3  2020-02-01
5  Code4  SG3  2020-02-01

df2 = pd.DataFrame({
    'Code': ['Code1', 'Code1', 'Code2', 'Code3'],
    'SG': ['SG1', 'SG1', 'SG2', 'SG3'],
    'Date': ["2019-01-01", "2020-02-25", "2020-01-13", "2020-01-25"],
    'Coef': [0.5, 0.7, 0.3, 0.3]
})

print(df2)

    Code   SG        Date  Coef
0  Code1  SG1  2019-01-01   0.5
1  Code1  SG1  2020-02-25   0.7
2  Code2  SG2  2020-01-13   0.3
3  Code3  SG3  2020-01-25   0.3
我想要以下结果:第二行聚合了coef 0.5x0.7=0.35,因为对应键的所有df2.Date都低于df1.Date

    Code   SG        Date  Coef
0  Code1  SG1  2020-02-01  0.50
1  Code1  SG1  2020-02-01  0.50
2  Code1  SG1  2020-03-01  0.35
3  Code2  SG2  2020-01-01   NaN
4  Code3  SG3  2020-02-01  0.30
5  Code4  SG3  2020-02-01   NaN
谢谢你的帮助。

好的,我终于找到了

按代码和SG合并(左连接) 为较低日期创建筛选器 我们在这里将无限赋值给真值,只是为了避免在使用NaNs执行
.prod()
函数时出现错误 Github关于nan聚合函数的问题:

按.prod()聚合 创建最终数据帧 最终产量 值得一提的是,您可以使用
.apply()
函数来实现这一点,但是,如果数据帧变大,这会降低您的速度

希望我能帮忙!我花了两个小时才把这段代码想清楚

编辑

正如@codesensei所提到的,他的数据库中还有其他列使得组合
['code','SG','Date']
不是唯一的。在这种情况下,有两种可能的解决方法。首先,如果df1或df2中有其他列使组合唯一,只需将它们添加到分组中,如下所示:

df_group = df_group.groupby(['Code','SG','Date','column_of_interest']).prod()
其次,如果更容易通过某种ID(比如df1的索引)使组合唯一,那么可以执行以下操作:

df1.reset_index(inplace = True)
# merge dataframes and follow the other steps as stated earlier in this answer
df_group = df_group.groupby(['Code','SG','Date','index']).prod()
如果需要,可以将“索引”重命名为其他名称,只是为了使其更显式


希望我能帮忙

第二排的
Code1 SG1 2020-03-01 0.35
背后的逻辑是什么,我在问题中没有看到body@anky,它是一个乘法基数,键(Code1,SG1)是两行,两个日期都低于我的第一个数据帧行中的日期–CODESENSE逻辑如下:对于DF1中的每一行,我们搜索对应的键DF2中的('Code','SG')用于获取和子集数据帧结果。然后我们必须在RESULT.date上进行筛选。这是一个很棒且鼓舞人心的解决方案。做得好。但它并不完全正确。要解决这个问题,您的代码中需要做一个调整。这是一条指令df_group=df_group.groupby(['Code','SG','date])。prod()事实上,df1数据帧是一个包含许多其他列的大型事务表。因此,三元组*(代码、SG、日期)不是唯一的。您必须为分组找到另一个键。我建议在框架df1中保留一份初始索引副本,并将其用于分组。如果是这种情况,请编辑您的问题并发布整个问题陈述。如果我们不知道问题的详细信息,则很难提供帮助。我已将我的问题编辑为尽可能明确我刚刚添加了df1['copy_idx']=df1.index和其他groupby['Code','SG','Date','copy_idx']
df_group.loc[df_group['lower_date_mask'] == False,'lower_date_mask'] = np.nan
df_group['Coef'] = df_group['Coef'] * df_group['lower_date_mask']
df_group.loc[df_group['lower_date_mask'] == 1.0,'lower_date_mask'] = np.inf
df_group = df_group.groupby(['Code','SG','Date']).prod()
df_group.reset_index(inplace = True)
df_group.loc[df_group['lower_date_mask'] == 1.0,'Coef'] = np.nan
df_group.drop(columns = ['lower_date_mask'],inplace = True)
    Code    SG  Date    Coef
    0   Code1   SG1 2020-02-01  0.50
    1   Code1   SG1 2020-03-01  0.35
    2   Code2   SG2 2020-01-01  NaN
    3   Code3   SG3 2020-02-01  0.30
    4   Code4   SG3 2020-02-01  NaN
df_group = df_group.groupby(['Code','SG','Date','column_of_interest']).prod()
df1.reset_index(inplace = True)
# merge dataframes and follow the other steps as stated earlier in this answer
df_group = df_group.groupby(['Code','SG','Date','index']).prod()