大熊猫平均某些行,同时保持其他行不变

时间:2017-04-18 14:27:49

标签: python pandas time-series

我有两个数据帧:df1和df2。

df1包含每日数据,有4列:date,id,value1,value2;

df2包含某些事件发生在id上的日期;它有两列:date和id。

df2是df1

中日期和id列的子集

对于df2中的每一行,我想在df1中找到具有相同日期和id的行,并获取该id的日期1到日期+ 1的行,取平均值并替换前三行

例如,如果我有df2的date = 3和id = A,我想在df1中找到日期在(2,3,4)和id = A的行,取这些行的平均值并替换这三行产生了一行。

DF1:

index date id value1 value2
  0    1    A  0.1     0.2
  1    2    A  0.2     0.3
  2    3    A  0.3     0.4
  3    4    A  0.4     0.5
  4    5    A  0.5     0.6
  5    1    B  0.1     0.2
  6    2    B  0.2     0.3
  7    3    B  0.3     0.4
  8    4    B  0.4     0.5
  9    5    B  0.5     0.6

DF2

index date id
  0     3    A
  1     3    B

期望的输出

index date id value1 value2
  0    1    A  0.1     0.2
  1    3    A  0.3     0.4
  2    5    A  0.5     0.6
  3    1    B  0.1     0.2
  4    3    B  0.3     0.4
  5    5    B  0.5     0.6

2 个答案:

答案 0 :(得分:2)

注意:

  • 看起来您想要计算带有居中窗口的3期滚动平均值。
  • 然后仅为事件列表(df2
  • 中的相关行切片
  • 最后,使用这些值
  • 更新第一个数据框(df1

计划:

  • 使用pd.DataFrame.rolling参数window=3center=True
  • 因为我需要稍后更新,我会将列['date', 'id']放在索引中。
  • 由于df2除了充当索引之外不做任何其他事情,我将明确地将其作为索引
  • 最后,我将使用locreset_index
  • 更新数据框
d1 = df1.set_index(['date', 'id'])
idx = pd.MultiIndex.from_arrays(df2.values.T)

d1.loc[idx] = d1.groupby(level='id', group_keys=False).rolling(3, center=True).mean()

d1.reset_index()

   date id  value1  value2
0     1  A     0.1     0.2
1     2  A     0.8     0.3
2     3  A     0.5     0.5
3     4  A     0.4     0.8
4     5  A     0.5     0.6
5     1  B     0.1     0.2
6     2  B     0.2     0.3
7     3  B     0.3     0.4
8     4  B     0.4     0.5
9     5  B     0.5     0.6

设置

# Note that changed the values of
# the 2nd row of value1 and 
# the 4th row of value2 in order to
# highlight that this works
df1 = pd.DataFrame({
        'date': [1, 2, 3, 4, 5, 1, 2, 3, 4, 5],
        'id': ['A', 'A', 'A', 'A', 'A', 'B', 'B', 'B', 'B', 'B'],
        'value1': [0.1, 0.8, 0.3, 0.4, 0.5, 0.1, 0.2, 0.3, 0.4, 0.5],
        'value2': [0.2, 0.3, 0.4, 0.8, 0.6, 0.2, 0.3, 0.4, 0.5, 0.6]
    })

df2 = pd.DataFrame({'date': [3, 3], 'id': ['A', 'B']})

答案 1 :(得分:1)

pd.concat([df1[(df1['id'] == row['id']) & df1['date'].isin([row['date'], row['date'] - 1, row['date'] + 1])] for _, row in df2.iterrows()])

这将导致:

       date id  value1  value2
index                         
1         2  A     0.2     0.3
2         3  A     0.3     0.4
3         4  A     0.4     0.5
6         2  B     0.2     0.3
7         3  B     0.3     0.4
8         4  B     0.4     0.5