ast*_*123 2 python numpy dataframe python-3.x pandas
我们如何才能有效地在pandas数据框中找到列的合并平均值?
我喜欢将专栏分为5部分,并找到每一部分的平均值。
这是我所做的:
import numpy as np
import pandas as pd
df = pd.DataFrame({'x': np.arange(20)})
n_bins = 5
dfs = np.array_split(df,n_bins)
x_means = [x.mean()[0] for x in dfs]
n_elems = len(df) // n_bins
x_mean_lst = [[i]*n_elems for i in x_means]
x_mean_array = np.array(x_mean_lst).flatten()
df['x_bin_mean'] = x_mean_array
df
Run Code Online (Sandbox Code Playgroud)
这似乎比必要的更为复杂。有更好的选择吗?
输出应如下所示:
x x_bin_mean
0 0 1.5
1 1 1.5
2 2 1.5
3 3 1.5
4 4 5.5
5 5 5.5
6 6 5.5
7 7 5.5
8 8 9.5
9 9 9.5
10 10 9.5
11 11 9.5
12 12 13.5
13 13 13.5
14 14 13.5
15 15 13.5
16 16 17.5
17 17 17.5
18 18 17.5
19 19 17.5
Run Code Online (Sandbox Code Playgroud)
我猜你想要类似的东西
df.groupby(df.index // (len(df) // n_bins))['x'].transform('mean')
Run Code Online (Sandbox Code Playgroud)
或者,如果您的索引不是数字,
df.groupby(pd.RangeIndex(len(df)) // (len(df) // n_bins))['x'].transform('mean')
Run Code Online (Sandbox Code Playgroud)
这是石斑鱼和输出的样子n_bins = 5,
df.index // (len(df) // 5)
# Int64Index([0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4], dtype='int64')
df['x_bin_mean'] = (
df.groupby(df.index // (len(df) // 5))['x'].transform('mean'))
df.head(10)
x x_bin_mean
0 0 1.5
1 1 1.5
2 2 1.5
3 3 1.5
4 4 5.5
5 5 5.5
6 6 5.5
7 7 5.5
8 8 9.5
9 9 9.5
Run Code Online (Sandbox Code Playgroud)
请注意,整数除法虽然速度很快,但可能无法处理索引均分的情况:
我不确定整数除法是否完全正确(如果事情没有平均除法)。例如,长度为16且n_bins = 5,则得到6个组-Alollz
在这种情况下,请使用Alollz的有用建议pd.qcut:
df.groupby(pd.qcut(df.index, n_bins))['x'].transform('mean')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
48 次 |
| 最近记录: |