Pandas:将依赖于第三列的同一数据框的两列相乘

Pandas: Multiplying two columns of same dataframe thats dependent on third column

如何在同一数据框中将 的两列相乘?我的数据框如下图所示,我想这样输出。但是,我找不到如何将依赖于同一数据框第一行的两列相乘。非常感谢您对此提供帮助。

request                            totalbytes
/login                              8520
/shuttle/countdown/                 7970
/shuttle/countdown/liftoff.html     0

到目前为止,我的输出如下,但我怎样才能获得唯一的行。

似乎只需要多列:

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

但第一列 request 可能需要 groupby 并使用 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, multiple and last 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

现在您已经解释了您想要的...您实际上想要删除重复项:

(df['bytesbytes']*df['bytesfrequency']).drop_duplicates()

请编辑您的标题,因为它非常具有误导性。

此外,为了回答您的问题,pandas 有一个方便的 drop_duplicates 方法。我强烈建议你去看看。

简而言之,该方法从字面上删除了所有重复的行和 returns 一个新的 DataFrame。或者,您可以使该方法仅考虑某些行 - 可以在文档中找到详细信息。

对于你的情况,你可以简单地做:

df2 = df2.drop_duplicates()[['requests', 'totalbytes']]

列索引完全是可选的,但我添加它们是因为我认为您只需要在最终输出中使用这两列。

获取发布的预期结果的快捷方式

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