如何根据pandas中的列值和时间戳进行顺序计数?

时间:2015-04-18 18:19:47

标签: python pandas

我希望能够添加一个列,该列根据值按顺序计算行数。例如,下面是三个记录具有时间戳的不同人。我想根据PersonID计算记录的顺序。这应该为每个PersonID重新启动。 (我能够在Tableau中使用Index()执行此操作,但我也希望它是原始文件的一部分)

> PersonID,             DateTime,             Order,     Total
    a226           2015-04-16 11:57:36          1          1
    a226           2015-04-17 15:32:14          2          1
    a226           2015-04-17 19:13:43          3          1
    z342           2015-04-15 07:02:20          1          1
    x391           2015-04-17 13:43:31          1          1
    x391           2015-04-17 05:12:16          2          1

如果还有办法减去DateTime吗?我的方法是只选择Order 1作为数据帧,然后只选择Order 2,然后合并,然后减去。有没有办法自动完成?

3 个答案:

答案 0 :(得分:1)

IIUC,您可以使用cumcount执行groupby

>>> df["Order"] = df.groupby("PersonID").cumcount() + 1
>>> df
  PersonID             DateTime  Order
0     a226  2015-04-16 11:57:36      1
1     a226  2015-04-17 15:32:14      2
2     a226  2015-04-17 19:13:43      3
3     z342  2015-04-15 07:02:20      1
4     x391  2015-04-17 13:43:31      1
5     x391  2015-04-17 05:12:16      2

如果你想保证它在增加时间顺序,你应该先按DateTime排序,但你的例子有x391不按递增顺序排列,所以我假设你没有& #39; t想要那个。


如果你想要涉及时间戳,我倾向于先排序,让生活更轻松:

>>> df["DateTime"] = pd.to_datetime(df["DateTime"]) # just in case
>>> df = df.sort(["PersonID", "DateTime"])
>>> df["Order"] = df.groupby("PersonID").cumcount() + 1
>>> df
  PersonID            DateTime  Order
0     a226 2015-04-16 11:57:36      1
1     a226 2015-04-17 15:32:14      2
2     a226 2015-04-17 19:13:43      3
5     x391 2015-04-17 05:12:16      1
4     x391 2015-04-17 13:43:31      2
3     z342 2015-04-15 07:02:20      1

即使没有排序,您也可以在分组列上调用rank,该列有更多选项来指定您希望如何处理关系:

>>> df["Order"] = df.groupby("PersonID")["DateTime"].rank()
>>> df
  PersonID            DateTime  Order
0     a226 2015-04-16 11:57:36      1
1     a226 2015-04-17 15:32:14      2
2     a226 2015-04-17 19:13:43      3
5     x391 2015-04-17 05:12:16      1
4     x391 2015-04-17 13:43:31      2
3     z342 2015-04-15 07:02:20      1

答案 1 :(得分:0)

你想使用groupby函数和sum。所以你可以尝试类似的东西: (假设您的数据框名为df) grouped = df.groupby("PersonID") 某些列的总和将是:grouped[column].sum() 如果您只想要唯一的值,则可以df["PersonID"].unique()

答案 2 :(得分:0)

熊猫> 0.20的更新:

sort()已从0.20版(2017-05-05)的熊猫中删除。现在有sort_values()sort_index()

当前运行的代码是:

df["DateTime"] = pd.to_datetime(df["DateTime"]) # just in case
df = df.sort_by(["PersonID", "DateTime"])
# Don't forget to add [] if you are grouping by more than one column!
df["Order"] = df.groupby("PersonID").cumcount() + 1

答案用作参考:'DataFrame' object has no attribute 'sort'