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