Joh*_*ker 9 python dataframe pandas
如何将b和c的方法添加到我的数据框中?我试过合并,但它似乎没有用.所以我想要两个额外的列b_mean和c_mean添加到我的数据帧中,结果为df.groupBy('date').mean()
数据帧
a b c date
0 2 3 5 1
1 5 9 1 1
2 3 7 1 1
Run Code Online (Sandbox Code Playgroud)
我有以下代码
import pandas as pd
a = [{'date': 1,'a':2, 'b':3, 'c':5}, {'date':1, 'a':5, 'b':9, 'c':1}, {'date':1, 'a':3, 'b':7, 'c':1}]
df = pd.DataFrame(a)
x = df.groupby('date').mean()
Run Code Online (Sandbox Code Playgroud)
编辑:
期望的输出将是以下
df.groupby('date').mean()返回:
a b c
date
1 3.333333 6.333333 2.333333
Run Code Online (Sandbox Code Playgroud)
我想要的结果将是以下数据框架
a b c date a_mean b_mean
0 2 3 5 1 3.3333 6.3333
1 5 9 1 1 3.3333 6.3333
2 3 7 1 1 3.3333 6.3333
Run Code Online (Sandbox Code Playgroud)
正如@ayhan所提到的,你可以使用pd.groupby.transform().变换类似于apply,但它使用与原始数据帧相同的索引,而不是分组的列中的唯一值.
df['a_mean'] = df.groupby('date')['a'].transform('mean')
df['b_mean'] = df.groupby('date')['b'].transform('mean')
>>> df
a b c date b_mean a_mean
0 2 3 5 1 6.333333 3.333333
1 5 9 1 1 6.333333 3.333333
2 3 7 1 1 6.333333 3.333333
Run Code Online (Sandbox Code Playgroud)
解决方案
使用join一个rsuffix参数.
df.join(df.groupby('date').mean(), on='date', rsuffix='_mean')
a b c date a_mean b_mean c_mean
0 2 3 5 1 3.333333 6.333333 2.333333
1 5 9 1 1 3.333333 6.333333 2.333333
2 3 7 1 1 3.333333 6.333333 2.333333
Run Code Online (Sandbox Code Playgroud)
我们可以将其限制为公正 ['a', 'b']
df.join(df.groupby('date')[['a', 'b']].mean(), on='date', rsuffix='_mean')
a b c date a_mean b_mean
0 2 3 5 1 3.333333 6.333333
1 5 9 1 1 3.333333 6.333333
2 3 7 1 1 3.333333 6.333333
Run Code Online (Sandbox Code Playgroud)
额外的功劳并
没有真正回答你的问题...但我觉得它很整洁!
d1 = df.set_index('date', append=True).swaplevel(0, 1)
g = df.groupby('date').describe()
d1.append(g).sort_index()
a b c
date
1 0 2.000000 3.000000 5.000000
1 5.000000 9.000000 1.000000
2 3.000000 7.000000 1.000000
25% 2.500000 5.000000 1.000000
50% 3.000000 7.000000 1.000000
75% 4.000000 8.000000 3.000000
count 3.000000 3.000000 3.000000
max 5.000000 9.000000 5.000000
mean 3.333333 6.333333 2.333333
min 2.000000 3.000000 1.000000
std 1.527525 3.055050 2.309401
Run Code Online (Sandbox Code Playgroud)
我假设您需要将列的平均值添加为数据框中的新列值。否则请纠正我。
您可以通过直接取列的平均值并通过分配创建一个新列来实现
In [1]: import pandas as pd
In [2]: a = [{'date': 1,'a':2, 'b':3, 'c':5}, {'date':1, 'a':5, 'b':9, 'c':1}, {'date':1, 'a':3, 'b':7, 'c':1}]
In [3]: df = pd.DataFrame(a)
In [4]: for col in ['b','c']:
...: df[col+"_mean"] = df.groupby('date')[col].transform('mean')
In [5]: df
Out[5]:
a b c date b_mean c_mean
0 2 3 5 1 6.333333 2.333333
1 5 9 1 1 6.333333 2.333333
2 3 7 1 1 6.333333 2.333333
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1248 次 |
| 最近记录: |