增量添加到Pandas组中的变换函数



我有一个大的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
​```

相关内容

  • 没有找到相关文章

最新更新