我有两个数据帧: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的行,取这些行的平均值并替换这三行产生了一行。
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
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
答案 0 :(得分:2)
注意:
df2
)df1
)
计划:
pd.DataFrame.rolling
参数window=3
和center=True
['date', 'id']
放在索引中。df2
除了充当索引之外不做任何其他事情,我将明确地将其作为索引loc
和reset_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