gpt4 book ai didi

Python Pandas - 计算总均值,按字段分组,然后计算分组均值并追加

转载 作者:行者123 更新时间:2023-12-05 04:37:07 27 4
gpt4 key购买 nike

假设我有一个包含“dir”和“speed”列的 pd.DataFrame:

import pandas as pd
df = pd.DataFrame({'dir': ['fwd', 'fwd', 'fwd', 'bwd', 'bwd'],
'speed': [10, 5, 1, 6, 8]})

# or with more columns:
df = pd.DataFrame({'dir': ['fwd', 'fwd', 'fwd', 'bwd', 'bwd'],
'speed': [10, 5, 1, 6, 8],
'mass': [100, 200, 100, 500, 300]})
   dir  speed

0 fwd 10

1 fwd 5

2 fwd 1

3 bwd 6

4 bwd 8

我试图计算 3 个东西,结果是一个包含 1 行的 DataFrame,包含“median_speed”、“median_fwd_speed”、“median_bwd_speed”。

我是 Pandas 的新手,所以请原谅我即将犯下的可怕错误。另外,我还有很多其他的东西正在计算中,所以保留 agg 绝对是可取的,但是去掉 np.where() 会很棒。

我目前拥有的:

# duplicate dir column for future referencing
df['dir2'] = df['dir']

# groupby and calc median for fwd and bwd
df = df.groupby('dir').agg({"dir2": lambda x: x.iloc[0], # how do I do nothing with agg?
"speed": "median"})

# grab forward and bwd fields
df['median_fwd_speed'] = np.where(df['dir2'] == 'fwd', df['speed'], 0)
df['median_bwd_speed'] = np.where(df['dir2'] == 'bwd', df['speed'], 0)

输出:

    dir2  speed  median_fwd_speed  median_bwd_speed

dir

bwd bwd 7.0 0.0 7.0

fwd fwd 5.0 5.0 0.0

当然输出不是 1 行,也不包含总中位数。任何帮助将不胜感激!

我或许可以使用 df["speed"].median() 并将其存储为变量,但是是否有仅使用 groupby 和 agg 的优雅方式?

多列的预期输出类似于:

median_speed    fwd_median_speed    bwd_median_speed    median_mass    fwd_median_mass    bwd_median_mass
6 5 7 200 100 400

最佳答案

像这样的东西应该可以工作

(df.groupby('dir')['speed']
.agg('median')
.append(pd.Series(index = ['total'], data = df['speed'].median()))
.to_frame()
.T
)

输出:


bwd fwd total
0 7.0 5.0 6.0

如果你想使用 .rename(columns = ...) 方法,你可以进一步重命名列

编辑

对于多列,这应该可以工作

(df.groupby('dir')
.agg('median')
.append(df.median().rename('total') )
.unstack()
.to_frame()
.T
)

输出


speed mass
dir bwd fwd total bwd fwd total
0 7.0 5.0 6.0 400.0 100.0 200.0

关于Python Pandas - 计算总均值,按字段分组,然后计算分组均值并追加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70752223/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com