获取pandas数据帧中的子组顺序

时间:2017-10-18 12:54:47

标签: python pandas

我有一个像这样的pandas数据框:

for line in str(sibling).splitlines():
    ...

我想添加一个列,告诉我,对于每个名称,时间的顺序是什么。

我想要这样的事情:

df = pd.DataFrame({'Name' : ['Kate', 'John', 'Peter','Kate', 'John', 'Peter'],'Distance' : [23,16,32,15,31,26], 'Time' : [3,5,2,7,9,4]})
df


  Distance  Name   Time
0   23      Kate    3
1   16      John    5
2   32      Peter   2
3   15      Kate    7
4   31      John    9
5   26      Peter   2

我可以使用for循环来实现:

 Order  Distance    Name    Time
    0       16      John    5
    1       31      John    9
    0       23      Kate    3
    1       15      Kate    7
    0       32      Peter   2
    1       26      Peter   4

这是有效的,问题是(除了非常非常规),对于大型表(我的实际表有大约5万行),它需要大约半小时才能运行。

有人可以用更简单的方式帮我写这个吗? 如果在某个地方已经回答了这个问题,我很抱歉,但我真的不知道如何搜索它。

最佳,

2 个答案:

答案 0 :(得分:2)

sort_values使用cumcount

df = df.sort_values(['Name','Time'])
df['Order'] = df.groupby('Name').cumcount()
print (df)

   Distance   Name  Time  Order
1        16   John     5      0
4        31   John     9      1
0        23   Kate     3      0
3        15   Kate     7      1
2        32  Peter     2      0
5        26  Peter     4      1

如果需要第一列使用insert

df = df.sort_values(['Name','Time'])
df.insert(0, 'Order', df.groupby('Name').cumcount())
print (df)
   Order  Distance   Name  Time
1      0        16   John     5
4      1        31   John     9
0      0        23   Kate     3
3      1        15   Kate     7
2      0        32  Peter     2
5      1        26  Peter     4

答案 1 :(得分:1)

In [67]: df = df.sort_values(['Name','Time']) \
                .assign(Order=df.groupby('Name').cumcount())

In [68]: df
Out[68]:
   Distance   Name  Time  Order
1        16   John     5      0
4        31   John     9      1
0        23   Kate     3      0
3        15   Kate     7      1
2        32  Peter     2      0
5        26  Peter     4      1

PS我不确定这是最优雅的方式......