【问题标题】:Pandas: Iterate over dataframe rows using date filterPandas:使用日期过滤器迭代数据框行
【发布时间】:2018-10-01 15:57:03
【问题描述】:

我有一个数据框,其中包含一系列日期和相应的值。我有另一个包含三列(mindate、maxdate、value)的数据框。我想使用 second 数据帧 mindate 和 maxdate 遍历 first 数据帧的每一行。然后,我想将每个 Value 乘以新 range df 中的 CustomerUsage 并返回总和。

>>df1        Date           Value
        0    2012-04-01     0.00275
        1    2012-04-02     0.00278
        2    2012-04-03     0.00369
        3    2012-04-04     0.00268
        4    2012-04-05     0.00400

>>df2       Start           End           CustomerUsage
        1   2012-04-01      2012-04-03    464.0
        2   2012-04-04      2012-04-04    472.1

>>    for  row in df2.iterrows():

           mindate = row[row.index[0],'Start']
           maxdate = row[row.index[0],'End']

           range = df1[(df1['Dates'] >= mindate) & (df1['Dates'] <= maxdate)]

           range['Calc'] = range['Value']*df2['CustomerUsage']
           ##numpy .agg function here##

单行可以工作,但我一直在迭代日期,AttributeError: 'str' object has no attribute 'loc' 的错误(我认为我错误地对待这些元组,但不确定补救措施的人!)

非常感谢!

【问题讨论】:

  • 你可以修复你的数据吗,结束日期早于开始
  • 谢谢,已修复!尝试将 customerusage 乘以 df1 日期范围内的每个值。
  • 您最后未注释的行不应该是:range['Calc'] = range['Value']*row['CustomerUsage']
  • @Wen 很好,我正在尝试进行类似的合并,但是对于 df2 的每一行,最终引用的 numpy .agg 函数会创建一个新列。我相信我的挂断是在头脑中的,一旦它们被引入 for 循环(错误地处理单个元组?)我正在使用的实际 df2 有数十万行用于各种不同日期范围的客户使用情况。

标签: python pandas dataframe merge


【解决方案1】:

好的,所以我最终得到了以下答案。肯定碰到过几个@Wen 的帖子哈哈

   #created an ID
   list_ = []
   df1.insert(0,'ID',range(0,0+len(df1)))
   for index, row in df1.iterrows():
       start = row['start']
       end = row['end']
       range = df2[(df2['date']>=start) & (df2['date']<=end)]
       df2['ID'] = row['ID']
       list_.append(df2)
   batch = pd.concat(list_)
   _small = batch.groupby(['ID']).agg({'value': np.sum})
   _merge = batch.reset_index().merge(_small.reset_index(), how = 'left', on = ['ID']

我正在尝试使用 itertuples,因为我阅读它的速度要快得多。速度至关重要,所以如果有人有任何升级...... :)

【讨论】:

    猜你喜欢
    • 2018-09-29
    • 2019-03-29
    • 2020-10-29
    • 2021-02-26
    • 2020-03-31
    • 2020-10-08
    • 1970-01-01
    • 2019-10-08
    • 2017-09-17
    相关资源
    最近更新 更多