【问题标题】:finding the difference in years for two common values in a column查找列中两个常见值的年差
【发布时间】:2014-04-24 14:55:21
【问题描述】:

我正在使用 pandas,我试图找出我的数据按标签分组然后按团队分组的年份差异。我尝试使用 groupby 来解决我正在处理的问题,但我无法完全得到我想要的结果。这是我的 df 的 head(8)

Team            Year    labels
Hawks           2001      b
Hawks           2004      b
Nets            1987      b
Nets            1988      a
Nets            2004      b
Nets            2001      a
Nets            2000      c
Hawks           2003      a

所以,让我感到困惑的是,我想要的基本上有两个组 - 标签和团队。然后我需要找到要排序的年份之间的差异,结果将在差异列中。任何帮助将不胜感激。

Team            Year    labels  difference
Hawks           2001      b       NAN
Hawks           2004      b        1
Nets            1987      b       NAN
Nets            1988      a       NAN
Nets            2004      b       17
Nets            2001      a       13
Nets            2000      c       NAN
Hawks           2003      b        2

【问题讨论】:

  • 数据中最后一行的标签为“a”,但预期输出的标签为“b”。是不是打错字了?

标签: pandas group-by


【解决方案1】:

不确定最后一行的label 应该是“a”还是“b”。从您的数据 sn-p:

Hawks           2003      a

从你的预期输出:

Hawks           2003      b        2

我假设 label 应该是 'b' 所以我可以匹配您的预期输出:

您想在 ['Team', 'Labels'] 上进行分组,您可以使用它来计算年份差异。但首先按 ['Team','labels','Year'] 对数据进行排序,这样你的年份差异计算是正确的:

In [8]: df.sort(['Team','labels','Year'],inplace=True)
In [9]: df
Out[9]: 
    Team  Year labels
0  Hawks  2001      b
7  Hawks  2003      b
1  Hawks  2004      b
3   Nets  1988      a
5   Nets  2001      a
2   Nets  1987      b
4   Nets  2004      b
6   Nets  2000      c

现在,对 ['Team','labels'] 进行分组并计算组中每一行的年份差:

In [10]: df['difference'] = df.groupby(['Team','labels'])['Year'].diff(1)
In [11]: df
    Team  Year labels  difference
0  Hawks  2001      b         NaN
7  Hawks  2003      b           2
1  Hawks  2004      b           1
3   Nets  1988      a         NaN
5   Nets  2001      a          13
2   Nets  1987      b         NaN
4   Nets  2004      b          17
6   Nets  2000      c         NaN

如果由于某种原因您想回到数据框的原始顺序,您可以执行以下操作:

In [12]: df.sort_index()
Out[12]: 
    Team  Year labels  difference
0  Hawks  2001      b         NaN
1  Hawks  2004      b           1
2   Nets  1987      b         NaN
3   Nets  1988      a         NaN
4   Nets  2004      b          17
5   Nets  2001      a          13
6   Nets  2000      c         NaN
7  Hawks  2003      b           2

【讨论】:

  • 非常感谢 - 我没有意识到你可以用两列分组 - 这是我的问题。我的一个问题是为什么 diff(1) 中有一个 1 ?
  • 你是对的;你可以只做diff(),因为默认是periods = 1。我只是直言不讳。
  • 哦,谢谢!我实际上对此一无所知。不过真的很有帮助!
猜你喜欢
  • 2021-05-11
  • 1970-01-01
  • 2020-06-16
  • 2012-08-27
  • 1970-01-01
  • 2017-04-21
  • 2021-03-11
  • 1970-01-01
相关资源
最近更新 更多