当前位置: 首页 > 知识库问答 >
问题:

如何在熊猫中基于列值和时间戳进行顺序计数?

葛奇
2023-03-14

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

> 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

有没有办法减去日期时间呢?我的方法是只选择顺序1作为数据帧,然后只选择顺序2,然后合并,然后减去。有没有一种方法可以自动完成?

共有3个答案

隆钊
2023-03-14

sort()已从0.20版(2017-05-05)中删除。现在有了sort\u values()sort\u 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”对象没有属性“sort”

谭勇
2023-03-14

您希望使用groupby函数和sum。因此,您可以尝试以下方法:(假设您的数据帧名为df)grouped=df.groupby(“PersonID”)某些列的总和将是:grouped[column].sum()如果您只需要唯一值,可以执行df[“PersonID”].unique()

宰宣
2023-03-14

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是按非递增顺序排序的,所以我假设你不希望这样。

如果您确实想涉及时间戳,我倾向于首先排序,以使生活更轻松:

>>> 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

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

>>> 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
 类似资料:
  • 问题内容: 因此,我的时间戳如下所示: 我将它们放在DataFrame中,并且尝试按升序对其进行排序。我尝试了以下方法。但是,它似乎不起作用 任何帮助表示赞赏。 问题答案: 您只需要确保正确表示格式规范,就可以将其转换为之前的 实际 日期时间。 这比分解组件中的时间戳并按照您的尝试执行多准则排序要直接得多。 演示版

  • 我有以下数据帧: 我需要删除等于的行。最有效的方法是什么?

  • 我正在使用: 熊猫版本0.23。0 Python版本3.6。5. Seaborn版本0.81。1. 我想要一列时间戳数据的方框图。我的dataframe不是一个时间序列,索引只是一个整数,但我创建了一列时间戳数据,使用: 我过滤掉所有由胁迫产生的NaT值。 在这一点上,我的数据看起来不错,我可以确认EVENT_DM_TS列的类型是Timestamp,没有无效值。 最后,要生成我调用的单变量方框图:

  • 问题内容: 所以,这是我的数据框 我还有另一个清单: 如果x.Country位于欧洲,我想创建一个新列“ Continent” 问题答案: 或者您可以直接 使用

  • 问题内容: 我需要在日期上将2个pandas数据框合并在一起,但是它们当前具有不同的日期类型。1是时间戳(从excel导入),另一个是。 有什么建议吗? 我已经尝试过了,但这仅适用于单个项目(例如),它不能让我应用于整个系列(例如)或数据框。 问题答案: 我从同事那里得到了一些帮助。 这似乎解决了上面发布的问题

  • 我有这样一个数据帧: 我如何摆脱第四行,因为它有sq_resid的最大值?注意:最大值将从一个数据集更改到另一个数据集,所以仅仅删除第4行是不够的。 我已经尝试了一些方法,比如我可以删除像下面这样留下数据帧的最大值,但是无法删除整行。