Bak*_*war 45 python group-by rename pandas
1).我有以下示例数据集:
>>> df
ID Region count
0 100 Asia 2
1 101 Europe 3
2 102 US 1
3 103 Africa 5
4 100 Russia 5
5 101 Australia 7
6 102 US 8
7 104 Asia 10
8 105 Europe 11
9 110 Africa 23
Run Code Online (Sandbox Code Playgroud)
我想通过ID和Region对这个数据集的观察进行分组,并总结每个组的计数.所以我使用了这样的东西:
>>> print(df.groupby(['ID','Region'],as_index=False).count().sum())
ID Region count
0 100 Asia 2
1 100 Russia 5
2 101 Australia 7
3 101 Europe 3
4 102 US 9
5 103 Africa 5
6 104 Asia 10
7 105 Europe 11
8 110 Africa 23
Run Code Online (Sandbox Code Playgroud)
使用as_index = False时,我可以获得"SQL-Like"输出.我的问题是我无法在这里重命名聚合变量计数.所以在SQL中,如果想做上述事情,我会做这样的事情:
select ID, Region, sum(count) as Total_Numbers
from df
group by ID, Region
order by ID, Region
Run Code Online (Sandbox Code Playgroud)
正如我们所看到的,我很容易将聚合变量'count'重命名为SQL中的Total_Numbers.我想在Pandas中做同样的事情,但无法在分组功能中找到这样的选项.有人可以帮忙吗?
2).第二个问题和更多的观察结果是,是否可以直接在Pandas数据帧函数中使用列名而不将它们括在引号内?我知道变量名是字符串,所以必须在引号内,但我看是否使用外部数据帧函数和作为属性我们不要求它们在引号内.像df.ID.sum()等一样.只有当我们在像df.sort()或df.groupby这样的DataFrame函数中使用它时,我们必须在引号内使用它.这实际上有点痛苦,就像在SQL或SAS或其他语言中我们只是使用变量名而不引用它们.有什么建议吗?
请注意以上两点(第一个主要,第二个意见).
谢谢
Rom*_*kar 49
对于第一个问题,我认为答案是:
<your DataFrame>.rename(columns={'count':'Total_Numbers'})
Run Code Online (Sandbox Code Playgroud)
要么
<your DataFrame>.columns = ['ID', 'Region', 'Total_Numbers']
Run Code Online (Sandbox Code Playgroud)
至于第二个,我会说答案是否定的.由于python datamodel,可以像'df.ID'一样使用它:
属性引用被转换为此字典中的查找,例如,mx等效于m.字典 ["x"]
Ted*_*rou 24
在groupby操作之后更改列名的当前(从版本0.20开始)方法是链接rename方法.有关更多详细信息,请参阅文档中的弃用说明.
这是谷歌的第一个结果,虽然最佳答案是有效的,但它并没有真正回答这个问题.这里有一个更好的答案,并在github上讨论了将字典传递给agg方法的全部功能.
遗憾的是,这些答案在文档中不存在,但用于分组,聚合和重命名列的一般格式使用字典字典.外部字典的键是要聚合的列名.内部字典具有键,新列以值作为聚合函数.
在我们到达之前,让我们创建一个四列DataFrame.
df = pd.DataFrame({'A' : list('wwwwxxxx'),
'B':list('yyzzyyzz'),
'C':np.random.rand(8),
'D':np.random.rand(8)})
A B C D
0 w y 0.643784 0.828486
1 w y 0.308682 0.994078
2 w z 0.518000 0.725663
3 w z 0.486656 0.259547
4 x y 0.089913 0.238452
5 x y 0.688177 0.753107
6 x z 0.955035 0.462677
7 x z 0.892066 0.368850
Run Code Online (Sandbox Code Playgroud)
比方说,我们按列要组A, B和集合列C与mean和median和聚合列D有max.以下代码将执行此操作.
df.groupby(['A', 'B']).agg({'C':['mean', 'median'], 'D':'max'})
D C
max mean median
A B
w y 0.994078 0.476233 0.476233
z 0.725663 0.502328 0.502328
x y 0.753107 0.389045 0.389045
z 0.462677 0.923551 0.923551
Run Code Online (Sandbox Code Playgroud)
这将返回带有分层索引的DataFrame.原始问题询问是否在同一步骤中重命名列.这可以使用词典字典:
df.groupby(['A', 'B']).agg({'C':{'C_mean': 'mean', 'C_median': 'median'},
'D':{'D_max': 'max'}})
D C
D_max C_mean C_median
A B
w y 0.994078 0.476233 0.476233
z 0.725663 0.502328 0.502328
x y 0.753107 0.389045 0.389045
z 0.462677 0.923551 0.923551
Run Code Online (Sandbox Code Playgroud)
这将一次性重命名列,但仍保留可以删除顶级的分层索引df.columns = df.columns.droplevel(0).
| 归档时间: |
|
| 查看次数: |
85030 次 |
| 最近记录: |