【问题标题】:Is there a way to get the previously received message by id in pandas?有没有办法在熊猫中通过 id 获取先前收到的消息?
【发布时间】:2021-01-22 20:14:55
【问题描述】:

我有一个这样的数据框:

ID  Message     week

10 A            1
11 A            1
12 C            1
10 B            2
12 B            2

我怎样才能得到这样的?:

ID  Message     week  previous

10 A            1     nan
11 A            1     nan
12 C            1     nan
10 B            2     A
12 B            2     A

【问题讨论】:

  • 12的上一条消息是C
  • 这是一个任务,而不是一个问题。您尝试过什么,您的代码遇到了什么问题?
  • 我已经尝试过 C2['i1']=C2['Trigger_no'][(C2.Semana.shift(1))] 之类的东西,我知道这不起作用,但至少可以换档实验

标签: pandas dataframe iteration


【解决方案1】:

使用asof 合并将最近的消息带到过去。 allow_exact_matches=False 防止在同一周合并。

df = df.sort_values('week')  # Only b/c merge_asof requires sorted input

res = (pd.merge_asof(df, df.rename(columns={'Message': 'previous'}), 
                     on='week', by='ID',
                     direction='backward', allow_exact_matches=False))

   ID Message  week previous
0  10       A     1      NaN
1  11       A     1      NaN
2  12       C     1      NaN
3  10       B     2        A
4  12       B     2        C

【讨论】:

  • merge_asof 在 pandas 中是一个非常漂亮的方法!
  • 我试过了,效果很好!非常感谢你!我有一个无关紧要的问题,但我想问你是否认为使用查看行的函数来实现这一点也是可能的。不是我需要它,我只是想了解如何定义查看具有重复 ID 的行的函数。谢谢
  • @moltke_colombia 该方法将更类似于@Erfan 提出的方法。 groupby 是一种创建 DataFrame 子集的方法,这些子集对于分组键都具有相同的值,因此 df.groupby("ID") 会将 DataFrame 分组到包含每个唯一“ID”的所有行的组中。然后,您可以将函数应用于这些行组,或使用内置聚合,如 shift,(非常有效)。
  • 谢谢!我明白你在说什么。非常感谢您的帮助,我对您的回答投了赞成票,但由于我是新人,所以它不会出现。
【解决方案2】:

我们可以在这里使用groupbySeries.shift

df["previous"] = df.groupby("ID")["Message"].shift()
   ID Message  week previous
0  10       A     1      NaN
1  11       A     1      NaN
2  12       C     1      NaN
3  10       B     2        A
4  12       B     2        C

【讨论】:

  • 不错的一个!打败我吧,如果['ID', 'week'] 不重复,绝对是一种更简单的方法
  • 谢谢。是的,我同意,这里的 ID 字段对于“干净”至关重要。
  • 非常感谢您的帮助!这是我最初尝试但失败的方法。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-22
  • 2016-02-24
  • 2018-09-21
  • 1970-01-01
  • 2022-06-13
  • 1970-01-01
相关资源
最近更新 更多