我希望能够添加一个列,该列根据值按顺序计算行数。例如,下面是三个记录具有时间戳的不同人。我想根据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,然后合并,然后减去。有没有办法自动完成?
答案 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)
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