Pandas:将依赖于第三列的相同数据框的两列相乘
Posted
技术标签:
【中文标题】Pandas:将依赖于第三列的相同数据框的两列相乘【英文标题】:Pandas: Multiplying two columns of same dataframe thats dependent on third column 【发布时间】:2017-08-27 20:31:34 【问题描述】:如何将同一数据框中的两列相乘?我的数据框如下图所示,我想这样输出。但是,我找不到如何将依赖于同一数据帧第一行的两列相乘。我非常感谢您对此的帮助。
request totalbytes
/login 8520
/shuttle/countdown/ 7970
/shuttle/countdown/liftoff.html 0
到目前为止,我的输出如下,但是我怎样才能获得唯一的行。
【问题讨论】:
要将两列相乘,只需将它们相乘:df['bytesbytes']*df['bytesfrequency']
。但是,您的预期结果不是两列的乘积。请准确解释你想要什么。对第一行的引用尤其令人费解。
我不听你的问题。首先,您的标题与您的问题不同;其次,据我所知,您想要的输出看起来是正确的;第三,显然您的 实际 期望结果是完全不同的(乘以与获得独特的元素)。您可以像直觉一样将列相乘,并且只获得唯一的行,那里有很多资源。请澄清你的问题。谢谢。
@Posh_Pumpkin:我得到了重复的值,如我的第二张图片所示。如何获取每个唯一 URL 的总字节数。感谢您的帮助。
@DYZ:我想要的输出就在问题下方,即代码块。我尝试在此处粘贴,但格式出现偏差。
【参考方案1】:
获得发布的预期结果的捷径
df.drop_duplicates().set_index('request').prod(1).reset_index(name='totalbytes')
request totalbytes
0 /shuttle/countdown 7970
1 /login 8520
2 /shuttle/countdown/liftoff.html 0
【讨论】:
【参考方案2】:似乎只需要多列:
df['totalbytes'] = df['bytesbytes']*df['bytesfrequency']
或者使用mul
:
df['totalbytes'] = df['bytesbytes'].mul(df['bytesfrequency'])
示例:
df = pd.DataFrame('bytesbytes':[3985,1420,0,0],
'bytesfrequency':[2,6,2,2])
df['totalbytes'] = df['bytesbytes']*df['bytesfrequency']
print (df)
bytesbytes bytesfrequency totalbytes
0 3985 2 7970
1 1420 6 8520
2 0 2 0
3 0 2 0
但可能需要groupby
第一列request
并使用transform
创建多个新的Series
(两列都由transform
转换,可能只需要一个):
df = pd.DataFrame( 'request':['a','a','b','b'],
'bytesbytes':[3985,1420,1420,0],
'bytesfrequency':[2,6,6,2])
g = df.groupby('request')
print (g['bytesbytes'].transform('first'))
0 3985
1 3985
2 1420
3 1420
Name: bytesbytes, dtype: int64
print (g['bytesfrequency'].transform('first'))
0 2
1 2
2 6
3 6
Name: bytesfrequency, dtype: int64
df['totalbytes'] = g['bytesbytes'].transform('first')*g['bytesfrequency'].transform('first')
print (df)
bytesbytes bytesfrequency request totalbytes
0 3985 2 a 7970
1 1420 6 a 7970
2 1420 6 b 8520
3 0 2 b 8520
编辑:
如果需要删除 request
列的重复项:
df = pd.DataFrame( 'request':['a','a','b','b'],
'bytesbytes':[3985,1420,1420,0],
'bytesfrequency':[2,6,6,2])
print (df)
bytesbytes bytesfrequency request
0 3985 2 a
1 1420 6 a
2 1420 6 b
3 0 2 b
一行解决方案 - drop_duplicates
,多个和最后一个 drop
列:
df = df.drop_duplicates('request')
.assign(totalbytes=df['bytesbytes']*df['bytesfrequency'])
.drop(['bytesbytes','bytesfrequency'], axis=1)
print (df)
request totalbytes
0 a 7970
2 b 8520
df = df.drop_duplicates('request')
df['totalbytes'] = df['bytesbytes']*df['bytesfrequency']
df = df.drop(['bytesbytes','bytesfrequency'], axis=1)
print (df)
request totalbytes
0 a 7970
2 b 8520
【讨论】:
谢谢。如何获取所有唯一请求的总字节数。所以我只需要两列:uniquerequests 和 totalbytes。正如我在问题下所示,在代码块中。非常感谢您的帮助。 我认为需要最后一个答案 -drop_duplicates
,多个和最后一个 drop
列。【参考方案3】:
请编辑您的标题,因为它非常具有误导性。
另外,为了回答您的问题,pandas
有一个方便的drop_duplicates
方法。我强烈建议您检查一下。
简而言之,该方法从字面上删除所有重复的行并返回一个新的DataFrame
。或者,您可以使该方法仅考虑某些行 - 可以在文档中找到详细信息。
在你的情况下,你可以简单地做:
df2 = df2.drop_duplicates()[['requests', 'totalbytes']]
列索引是完全可选的,但我添加它们是因为我认为您只需要在最终输出中的这两列。
【讨论】:
【参考方案4】:现在您已经解释了您想要什么...您实际上想要删除重复项:
(df['bytesbytes']*df['bytesfrequency']).drop_duplicates()
【讨论】:
以上是关于Pandas:将依赖于第三列的相同数据框的两列相乘的主要内容,如果未能解决你的问题,请参考以下文章
python pandas dataframe:将函数返回元组分配给数据框的两列