一列的平均值基于另一列的值

时间:2021-03-03 15:17:36

标签: python dataframe for-loop

我有一个数据框,其中一列有许多重复值。我想创建另一个数据框,该数据框只有一个该值的实例与来自原始数据框另一列的匹配值的平均值配对。 示例:

data = [[1,1],[1,2],[2,2],[3,3],[3,1],[2,3],[1,5],[2,7],[3,9]]

df = pd.DataFrame(data, columns = ['A', 'B'])
   A  B
0  1  1
1  1  2
2  2  2
3  3  3
4  3  1
5  2  3
6  1  5
7  2  7
8  3  9

我想平均与 A 列值匹配的 B 列值。然后有一个看起来像这样的新数据框:

  A  B
0  1  2.7
1  2  4
2  3  4.3

我通过循环来做到这一点:

df2 = pdDataFrame(columns = ['A','B'])
uni = df.A.unique()
for x in uni:
    av = df.loc[(df['A'] == x, 'B')].mean()
    df2 = df2.append(pd.DataFrame([[x, av]], columns = ['A', 'B']))

我知道循环遍历 DataFrame 不是一种好的方式,而且这个过程需要很长时间。它还导致没有索引的 DataFrame(它们都是 0)。什么是更合适和有效的方法来做到这一点。提前致谢!

2 个答案:

答案 0 :(得分:1)

简单地说:

df.groupby('A')[['B']].mean().reset_index()
    A      B
0   1   2.666667
1   2   4.000000
2   3   4.333333

如果你想要B四舍五入:

df.groupby('A')[['B']].mean().round(1).reset_index()
    A    B
0   1   2.7
1   2   4.0
2   3   4.3

甚至这样,不使用 A 作为索引,参数为 as_index=False

df.groupby('A', as_index=False)[['B']].mean().round(1)
    A    B
0   1   2.7
1   2   4.0
2   3   4.3

答案 1 :(得分:0)

您可以按列 class MyHomePage extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( appBar: SliverAppBar(), body: new NestedScrollView( headerSliverBuilder: (BuildContext context, bool innerBoxIsScrolled) { return <Widget>[ new SliverAppBar( pinned: true, title: new Text('Flutter Demo'), ), ]; }, body: new Column( children: <Widget>[ new FlutterLogo(size: 100.0, colors: Colors.purple), new Container( height: 300.0, child: new ListView.builder( itemCount: 60, itemBuilder: (BuildContext context, int index) { return new Text('Item $index'); }, ), ), new FlutterLogo(size: 100.0, colors: Colors.orange), ], ), ), ); } } 对表格进行分组并计算每个这样的组的平均值:

"A"

结果:

<块引用>
df.groupby("A").mean()