将Pandas groupby对象的行索引重命名

3

我有一个GroupBy对象,行索引是整数。

light   worst_injury count
1       5            10217
2       5            4067
3       5            2142
4       5            1690
5       5            25848
6       5            734
9       5            18

我想重新命名行(而不是列!),以便“light”列包含特定的字符串:

light    worst_injury    count
Day             5        10217
Dawn            5        4067
Dusk            5        2142
Dark- lit       5        1690
Dark- unlit     5        25848
Other           5        734
Unknown         5        18

我有一系列字符串,对应每个数字(例如'Day'、'Dawn'等),但我不知道如何在GroupBy函数调用之前或期间将它们设置为索引。我也尝试过制作一个透视表,但由于相同的原因看起来无法这样做。
我想我可以编写一个脚本来更改原始数据为这些字符串,而不是数字。这似乎是一种效率较低的方法,但如果在事实上之前或之后更改groupby对象没有办法,我开放这个选项。
以下是现有的代码;它将数据框按照灯光和每个受伤程度进行分组,然后计算数量:
df = pd.read_csv(filename, sep='|', usecols=['crash_deer_involv_assoc', 'worst_injury_in_accident', 'light', 'accident_month'])

for i in range(1,6):
    inj = df[(df['worst_injury_in_accident'] == i)] 
    grouped = inj.groupby(['light','worst_injury_in_accident'])
    grouped.agg('count')
1个回答

5

如果我理解正确,您可以使用字典 d 来使用 map

#maybe first reset index
df = df.reset_index()

print df
   light  worst_injury  count
0      1             5  10217
1      2             5   4067
2      3             5   2142
3      4             5   1690
4      5             5  25848
5      6             5    734
6      9             5     18

d = {1:'Day',2:'Dawn', 3:'Dusk',4:'Dark- lit',5:'Dark- unlit',6:'Other',9:'Unknown'}

df['light'] = df.light.map(d)
print df
         light  worst_injury  count
0          Day             5  10217
1         Dawn             5   4067
2         Dusk             5   2142
3    Dark- lit             5   1690
4  Dark- unlit             5  25848
5        Other             5    734
6      Unknown             5     18

如果列 lightindex:
print df
       worst_injury  count
light                     
1                 5  10217
2                 5   4067
3                 5   2142
4                 5   1690
5                 5  25848
6                 5    734
9                 5     18

d = {1:'Day',2:'Dawn', 3:'Dusk',4:'Dark- lit',5:'Dark- unlit',6:'Other',9:'Unknown'}

df.index = df.index.to_series().map(d)
print df
             worst_injury  count
light                           
Day                     5  10217
Dawn                    5   4067
Dusk                    5   2142
Dark- lit               5   1690
Dark- unlit             5  25848
Other                   5    734
Unknown                 5     18

编辑:

对于聚合,您可以向groupby添加参数as_index=False并调用count - 输出是漂亮的DataFrame,无需使用reset_index

print df.groupby(['light','worst_injury_in_accident'], as_index=False).count()

另一种选择是使用 size (对于我来说,as_index 不起作用,因此您需要调用 reset_index)。
print df.groupby(['light','worst_injury_in_accident']).size().reset_index(name='count')

顺便提一下,区别size 包括 NaN 值,而count 则不包括。


你的第一个解决方案完美地解决了问题!reset_index() 看起来非常有用。一开始我遇到了一个属性错误 "'DataFrame' object has no attribute 'light'",但是当我将 df.light.map 更改为 df['light'].map 时,问题得到了解决。感谢你的帮助! - ale19
1
谢谢。我尝试添加更好的聚合解决方案,请查看我的编辑。 - jezrael
这正是我一直在寻找的——一些微小的选项或参数,可能是我在搜索中错过了。感谢您详细的回答!我已经接受了它。 - ale19

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接