Python 使用groupby.size()结果进行算术运算
我遇到了下面的问题,我陷入了困境,不幸的是,我自己无法解决,或者我在stackoverflow上发现了类似的问题 为了简单起见,我将给出我的问题的一个简短示例: 我得到了一个数据框,其中有几列和一列指示用户的ID。同一用户在此数据框中可能有多个条目:Python 使用groupby.size()结果进行算术运算,python,pandas,group-by,Python,Pandas,Group By,我遇到了下面的问题,我陷入了困境,不幸的是,我自己无法解决,或者我在stackoverflow上发现了类似的问题 为了简单起见,我将给出我的问题的一个简短示例: 我得到了一个数据框,其中有几列和一列指示用户的ID。同一用户在此数据框中可能有多个条目: | | userID | col2 | col3 | +---+-----------+----------------+-------+ | 1 | 1 | a |
| | userID | col2 | col3 |
+---+-----------+----------------+-------+
| 1 | 1 | a | b |
| 2 | 1 | c | d |
| 3 | 2 | a | a |
| 4 | 3 | d | e |
像这样的。现在我想知道属于某个用户ID的行数。对于这个操作,我尝试使用df.groupby('userID').size()
,作为回报,我想使用它进行另一个简单的计算,比如除法whatshover。
但当我试图将计算结果保存在一个单独的列中时,我不断得到NaN值
有没有办法解决这个问题,让我在一个单独的列中得到计算结果
谢谢你的帮助
编辑//
为了弄清楚,我的输出应该是什么样子。上面的数据框就是我的主数据框。除了这个框架,我还有第二个框架,看起来像这样:
| | userID | value | value/appearances |
+---+-----------+----------------+-------+
| 1 | 1 | 10 | 10 / 2 = 5 |
| 3 | 2 | 20 | 20 / 1 = 20 |
| 4 | 3 | 30 | 30 / 1 = 30 |
因此,我基本上希望在“值/外观”列中得到值列中的数字除以主数据框中该特定用户的外观数量的结果。对于ID=1的用户,这将是10/2,因为该用户的值为10,并且在主数据帧中有2行。
我希望这能让它更清楚一点。IIUC您要执行以下操作,
groupby
在“userID”上调用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与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
IIUC您要在“userID”上执行以下操作,
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与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
不完全是我想要的。我想要df.groupby('userID').size()输出的结果用于另一个计算:假设我有另一个数据帧:userID value/appearanses 1 10/2=5这就是我想要使用它的结果,如最后一列“value/appearanses”所示。所以基本上每个用户都有一个总的值,我想用这个值除以用户在数据框中的出现次数。你可以将其作为聚合或lambda func进行计算,也可以根据上面添加的列进行计算,任何一种方法都可以,但是如果你在单独的步骤中进行,那么你可能会更容易提问,但是你能告诉我lambda函数是什么样子吗?像这样的?df2['value/appearancess']=df1['value'].apply(lambda x:x['value']/df.groupby('userID').size())?很抱歉,如果这可能是完全错误的,我对pandas或python一般来说还是个新手。
df2['value/appearancess']=df.groupby('userID')。apply(lambda x:x['value']/x.size())
我认为,如果您编辑了问题以显示所需的输出,这将非常有用。我忘了在我的代码片段中提到,用户的值列和多行位于两个不同的数据帧中。正如您所建议的,我在第一篇文章中给出了一个输出示例。希望这不是我想要的。我想要df.groupby('userID').size()输出的结果用于另一个计算:假设我有另一个数据帧:userID value/appearanses 1 10/2=5这就是我想要使用它的结果,如最后一列“value/appearanses”所示。所以基本上每个用户都有一个总的值,我想用这个值除以用户在数据框中的出现次数。你可以将其作为聚合或lambda func进行计算,也可以根据上面添加的列进行计算,任何一种方法都可以,但是如果你在单独的步骤中进行,那么你可能会更容易提问,但是你能告诉我lambda函数是什么样子吗?像这样的?df2['value/appearancess']=df1['value'].apply(lambda x:x['value']/df.groupby('userID').size())?很抱歉,如果这可能是完全错误的,我对pandas或python一般来说还是个新手。df2['value/appearancess']=df.groupby('userID')。apply(lambda x:x['value']/x.size())
我认为,如果您编辑了问题以显示所需的输出,这将非常有用。我忘了在我的代码片段中提到,用户的值列和多行位于两个不同的数据帧中。正如您所建议的,我在第一篇文章中给出了一个输出示例。希望这个助手您的问题与您最初提出的问题有所不同听起来您想将大小添加到第二个df中,然后使用它创建一个新列,您不能执行df1['size']=df1['userID'].map(df.groupby('userID').size())
很抱歉,您的问题与您最初提出的问题有所不同。听起来您想将大小添加到第二个df中,然后使用它创建一个新列,您不能执行df1['size']=df1['userID'].map(df.groupby('userID').size())