假设我有一个包含“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个值,结果是一个包含“median_speed”,“median_fwd_speed”和“median_bwd_speed”的1行DataFrame。
我对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
当然,输出不止一行,并且不包含总中位数。任何帮助将不胜感激!
我可能可以使用 `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