使用日期和条件的带条件的Python总和

时间:2019-03-13 15:46:44

标签: python pandas date sum

我必须使用数据框,并且正在使用熊猫。 我想从可变日期和列中的值开始求和

我想在df2中添加第二列,以显示日期,以了解在df2中date2之后AVG列的总和大于100的日期。

例如,以df1和df2是我开始的数据帧,而df3是我想要的数据,而df3 ['date100']是avg之和大于100的那一天:

df1 = pd.DataFrame({'date1': ['1/1/2014', '2/1/2014', '3/1/2014','1/1/2014', '2/1/2014', '3/1/2014','1/1/2014', '2/1/2014', '3/1/2014'],
 'Place':['A','A','A','B','B','B','C','C','C'],'AVG': [62,14,47,25,74,60,78,27,41]})

df2 = pd.DataFrame({'date2': ['1/1/2014', '2/1/2014'], 'Place':['A','C'])})

*Something*
df3 = pd.DataFrame({'date2': ['1/1/2014', '2/1/2014'], 'Place':['A','C'], 'date100': ['3/1/2014', '2/1/2014'], 'sum': [123, 105]})

我找到了一些答案,但是大多数答案使用groupby,而df2没有群组。

2 个答案:

答案 0 :(得分:0)

由于您的示例非常基础,如果您有一些极端的情况需要我照顾,请问一下。该解决方案暗示:

解决方案:

www.mysite.com/wp-content/plugins/js_composer/assets/js/dist/backend.min.js?ver=5.7

答案 1 :(得分:0)

这是一个直接的解决方案,具有以下假设:

  • df1按日期排序
  • df2中每个日期都有一个解决方案

您可以执行以下操作:

df2 = df2.join(pd.concat([
        pd.DataFrame(pd.DataFrame(df1.loc[df1.date1 >= d].AVG.cumsum()).query('AVG>=100')
                .iloc[0]).transpose()
        for d in df2.date2]).rename_axis('ix').reset_index())\
    .join(df1.drop(columns='AVG'), on='ix').rename(columns={'AVG': 'sum', 'date1': 'date100'})\
    .drop(columns='ix')[['date2', 'date100', 'sum']]

这将执行以下操作:

  • 针对df2中的每个日期,找到AVG累计量至少为100的第一个日期
  • 将结果组合到一个由df1中该行的索引索引的单个数据帧中
  • 将该索引存储在ix列中,然后重置索引以将该数据帧连接到df2
  • 使用AVG列将其连接到df1减去ix
  • 重命名列,删除ix列,然后重新排列所有内容