【问题标题】:Grouping Unique Strings in a Column and Performing Function On Separate Column Values对列中的唯一字符串进行分组并对单独的列值执行功能
【发布时间】:2020-01-26 06:00:36
【问题描述】:

在我的数据框中,我有一列“away_lineup”,其中包含 5 个字符串的分组,还有一个“play_length”列,其中每一行都有一个持续时间值。我知道 np.unique 可以检测唯一的字符串值,并且 np.sum 值在列中添加值,但是我如何使用像 np.unique 这样的函数来检测每个唯一的字符串并对字符串的“play_length”值求和连续发生?

away_lineup                                                                play_length
0  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:05
1  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:10
2  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:20
3  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:07
4  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons     0:00:25
5  Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, JJ Redick       0:00:14

我想要的输出是这样的

player              play_length
Dario Saric             0:01:21
Robert Covington        0:01:21
Joel Embiid             0:01:21
Markelle Fultz          0:01:21
Ben Simmons             0:01:07
JJ Redick               0:00:14

其中唯一名称从“away_lineup”中提取,存储在新列“player”中,并且存在 player 值的行添加了它们的“play_length”值。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    使用pandas.DataFrame.explode 和pandas.to_timedelta:

    注意:pandas.DataFrame.explode 可用于pandas >= 0.25

    df['away_lineup'] = df['away_lineup'].str.split(', ')
    df['play_length'] = pd.to_timedelta(df['play_length'])
    new_df = df.explode('away_lineup').groupby('away_lineup').sum()
    print(new_df)
    

    输出:

                     play_length
    away_lineup                 
    Ben Simmons         00:01:07
    Dario Saric         00:01:21
    JJ Redick           00:00:14
    Joel Embiid         00:01:21
    Markelle Fultz      00:01:21
    Robert Covington    00:01:21
    

    【讨论】:

      【解决方案2】:

      如果你的熊猫不支持explode:

      df['play_length'] = pd.to_timedelta(df['play_length'])
      
      new_df = pd.concat((df[['play_length']], 
                          df['away_lineup'].str.split(',\s*', expand=True)), 
                         axis=1)
      
      (new_df.melt(id_vars=['play_length'], 
                   value_vars=new_df.columns[1:], 
                   value_name='artist')
         .groupby('artist').play_length.sum()
      )
      

      输出:

      artist
      Ben Simmons        00:01:07
      Dario Saric        00:01:21
      JJ Redick          00:00:14
      Joel Embiid        00:01:21
      Markelle Fultz     00:01:21
      Robert Covington   00:01:21
      Name: play_length, dtype: timedelta64[ns]
      

      【讨论】:

      • 与@Dev Kadka 的回答一起工作,谢谢!
      【解决方案3】:

      查看get_dummies的诡计

      #df['play_length'] = pd.to_timedelta(df['play_length'])
      
      df.away_lineup.str.get_dummies(',').mul(df.play_length,0).sum()
      Out[372]: 
       Ben Simmons        00:01:07
       JJ Redick          00:00:14
       Joel Embiid        00:01:21
       Markelle Fultz     00:01:21
       Robert Covington   00:01:21
       Dario Saric        00:01:21
      dtype: timedelta64[ns]
      

      【讨论】:

      • 我得到这个错误 AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
      • @SmallChimp 您需要通过 dict 向我们展示数据,因为我们不知道您的列中的数据类型是什么
      • 我很抱歉@WeNYoBen,“away_lineup”和“play_length”被存储为“非空对象”。他们需要转换成别的东西吗?如果我没有完全回答你的问题,我很抱歉。
      【解决方案4】:

      你可以像这样使用explode和group by

      import numpy as np
      import pandas as pd
      
      ## create dummy data
      arr = [("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:05"),
      ("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:10"),
      ("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:20"),
      ("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:07"),
      ("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, Ben Simmons", "00:00:25"),
      ("Dario Saric, Robert Covington, Joel Embiid, Markelle Fultz, JJ Redick", "00:00:14"),]
      
      df = pd.DataFrame(arr, columns=["Player", "Play Time"])
      df["Play Time"] = pd.to_timedelta(df["Play Time"])
      
      ## Solution
      df["Player"] = df["Player"].str.split(",")
      df.explode("Player").groupby("Player").sum()
      

      输出

                  Play Time
      Player  
      Ben Simmons 00:01:07
      JJ Redick   00:00:14
      Joel Embiid 00:01:21
      Markelle Fultz  00:01:21
      Robert Covington    00:01:21
      Dario Saric 00:01:21
      

      【讨论】:

        猜你喜欢
        • 2020-03-24
        • 2020-08-08
        • 1970-01-01
        • 2021-02-14
        • 2017-11-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多