我已经在这个问题上停留了很长时间,找不到类似的东西,所以我不胜感激一些提示。我有两个数据帧;df1
~1,200,000 行,df2
对于df2
中的 500 行中的每一行,我都有一组行号,对应于df1
中的值,存储在 numpy 数组中。对于每一行,我想根据指示的行号计算df1
的平均值,并将其添加到df2
中。 下面是一个示例,假设df2
只有三行。
some_array = np.array([102, 562, 132467, 4345, 122],
[53693, 562, 333, 6454, 2456],
[102, 562, 132467, 1666, 222])
因此,对于some_array
中的每一行,我想使用指定的行号计算df1
均值集。因此,在这种情况下,第一行df2
将是
df2.iloc[0] = df1.iloc[some_array[0]].mean()
但对于some_array
中的所有行.我可以通过迭代方法轻松解决此问题,但不幸的是它太慢了。我真的无法理解更快的方法。
任何帮助将不胜感激,我希望问题清楚!
IIUC,你可以做这样的事情:
some_array = np.array([[1,2,3,4],
[0,1,2,3],
[2,3,4,5]])
df = pd.DataFrame(np.arange(18).reshape(6,-1))
groups = np.repeat(np.arange(some_array.shape[0]), some_array.shape[1])
df.iloc[some_array.ravel()].groupby(groups).apply(lambda x: x.mean(1))
输出:
0 1 4.0
2 7.0
3 10.0
4 13.0
1 0 1.0
1 4.0
2 7.0
3 10.0
2 2 7.0
3 10.0
4 13.0
5 16.0
dtype: float64
或者,如果您不需要将原始行号保留在some_array
中,您可以执行以下操作:
(df.iloc[some_array.ravel()]
.groupby(groups)
.apply(lambda x: x.mean(1).reset_index(drop=True))
)
输出:
0 1 2 3
0 4.0 7.0 10.0 13.0
1 1.0 4.0 7.0 10.0
2 7.0 10.0 13.0 16.0