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

时间:2017-04-03 04:58:15

标签: python pandas data-analysis data-science

如何在同一数据帧中乘以两列?我的数据框看起来像下面的图像,我想像这样输出。但是,我找不到如何将依赖于同一数据帧的第一行的两列相乘。我真的很感激你的帮助。

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

enter image description here

到目前为止,我的输出在下面,但我怎样才能得到唯一的行。 enter image description here

4 个答案:

答案 0 :(得分:3)

似乎只需要多列:

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

答案 1 :(得分:1)

现在你解释了你想要的东西......你真的想要删除重复项:

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

答案 2 :(得分: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

答案 3 :(得分:0)

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

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

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

在您的情况下,您可以这样做:

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

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