我有一个大的DataFrame,其中许多列是原始数据的GroupBy函数。计算所有这些函数需要很长时间。每天我都会得到一些新数据,目前我都是从零开始计算所有这些函数。有没有一种方法可以不用重新计算整个函数就能完成GroupBy函数呢?我将提供一个小的DataFrame作为示例:
df = pd.DataFrame({'x': [0, 1, 2, 5, 4, 5, 8, 7], 'g1': ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'a'], 'g2': ['a', 'b', 'a', 'a', 'b', 'b', 'a', 'a']})
x g1 g2
0 0 a a
1 1 b b
2 2 c a
3 5 a a
4 4 b b
5 5 c b
6 8 a a
7 7 a a
现在是一个示例列:
def lag(array):
out = np.nan * array
out[1:] = array[:-1]
return out
df['y'] = df.groupby(['g1', 'g2'])['x'].transform(lag)
x g1 g2 y
0 0 a a NaN
1 1 b b NaN
2 2 c a NaN
3 5 a a 0.0
4 4 b b 1.0
5 5 c b NaN
6 8 a a 5.0
7 7 a a 8.0
现在让我们说我有一些新的数据附加到我原来的DataFrame:
newdf = pd.DataFrame({'x': [2, 1], 'g1': ['a', 'b'], 'g2': ['a', 'b']})
df = df.append(newdf)
x g1 g2 y
0 0 a a NaN
1 1 b b NaN
2 2 c a NaN
3 5 a a 0.0
4 4 b b 1.0
5 5 c b NaN
6 8 a a 5.0
7 7 a a 8.0
0 2 a a NaN
1 1 b b NaN
现在是否有一种方法来计算'y'为最后2行,而不只是重新计算整个列,以产生以下数据框架?
x g1 g2 y
0 0 a a NaN
1 1 b b NaN
2 2 c a NaN
3 5 a a 0.0
4 4 b b 1.0
5 5 c b NaN
6 8 a a 5.0
7 7 a a 8.0
0 2 a a 7.0
1 1 b b 4.0
这样做的一种方法是:
首先创建一个列,该列指示哪些行已经应用了延迟,然后通过使用mask
将延迟应用到没有应用的行df['applied'] = 1
df = df.append(newdf)
df['y'].mask(df['applied']!=1, df.groupby(['g1', 'g2'])['x'].transform(lag), inplace=True)
,
x g1 g2 y applied
0 0 a a NaN 1.0
1 1 b b NaN 1.0
2 2 c a NaN 1.0
3 5 a a 0.0 1.0
4 4 b b 1.0 1.0
5 5 c b NaN 1.0
6 8 a a 5.0 1.0
7 7 a a 8.0 1.0
0 2 a a 7.0 NaN
1 1 b b 4.0 NaN
然后删除applied
列:
df = df.drop(['applied'], axis=1)
给出你想要的:
x g1 g2 y
0 0 a a NaN
1 1 b b NaN
2 2 c a NaN
3 5 a a 0.0
4 4 b b 1.0
5 5 c b NaN
6 8 a a 5.0
7 7 a a 8.0
0 2 a a 7.0
1 1 b b 4.0
```