【问题标题】:Pandas: Multiplying two columns of same dataframe thats dependent on third columnPandas:将依赖于第三列的相同数据框的两列相乘
【发布时间】: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:我想要的输出就在问题下方,即代码块。我尝试在此处粘贴,但格式出现偏差。

标签: python pandas data-analysis data-science


【解决方案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()
      

      【讨论】:

        猜你喜欢
        • 2013-09-10
        • 1970-01-01
        • 2023-03-05
        • 2011-09-25
        • 2021-09-15
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多