使用pandas groupby.size()结果进行算术运算

时间:2016-03-15 15:08:34

标签: python pandas group-by

我遇到了以下问题,但我很遗憾无法通过自己或者我在stackoverflow上发现的类似问题来解决这个问题。

为了简单起见,我将简要介绍一下我的问题:

我得到了一个包含多个列和一列的Dataframe,用于指示用户的ID。可能会发生同一用户在此数据框中有多个条目:

|   |  userID   |      col2      | col3  |
+---+-----------+----------------+-------+
| 1 | 1         | a              |     b |
| 2 | 1         | c              |     d |
| 3 | 2         | a              |     a |
| 4 | 3         | d              |     e |

像这样的东西。现在我想知道属于某个userID的行数。对于这个操作,我尝试使用df.groupby('userID').size()作为回报,我想用于另一个简单的计算,比如分割它。 但是当我尝试在单独的列中保存计算结果时,我不断获得NaN值。

有没有办法解决这个问题,以便我在单独的列中得到计算结果?

感谢您的帮助!

编辑//

要弄清楚,我的输出应该如何。可以说,上面的数据帧是我的主要数据框架。除了这个框架,我得到了第二帧看起来像这样:

|   |  userID   |      value     | value/appearances  |
+---+-----------+----------------+-------+
| 1 | 1         | 10             |     10 / 2 = 5     |
| 3 | 2         | 20             |     20 / 1 = 20    |
| 4 | 3         | 30             |     30 / 1 = 30    |

所以我基本上希望在列'value / appearances'中将值列中的数字的结果除以主数据帧中该特定用户的出现次数。对于ID = 1的用户,这将是10/2,因为该用户的值为10并且在主数据帧中有2行。 我希望这会让它更清晰一点。

1 个答案:

答案 0 :(得分:2)

您想要执行以下操作的IIUC,{user}上的groupby并在分组列上调用transform并传递'size'以标识要调用的方法:

In [54]:
df['size'] = df.groupby('userID')['userID'].transform('size')
df

Out[54]:
   userID col2 col3  size
1       1    a    b     2
2       1    c    d     2
3       2    a    a     1
4       3    d    e     1

你尝试了什么:

In [55]:
df.groupby('userID').size()

Out[55]:
userID
1    2
2    1
3    1
dtype: int64

当分配回df与df索引对齐时,它为最后一行引入了NaN

In [57]:
df['size'] = df.groupby('userID').size()
df

Out[57]:
   userID col2 col3  size
1       1    a    b     2
2       1    c    d     1
3       2    a    a     1
4       3    d    e   NaN