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:将依赖于第三列的相同数据框的两列相乘的主要内容,如果未能解决你的问题,请参考以下文章

SQL:包含 NULLS 的两列的总和?

查找两列的最大值并在第三列中填充值

python pandas dataframe:将函数返回元组分配给数据框的两列

如何将所有行的两列总和为第三列

怎样在matlab中把矩阵的两列合并成一列,只是把两列的数据放在一起

应用字典查找功能来比较熊猫数据框列