【问题标题】:Counting the occurrences of a substring from one column within another column计算另一列中一列中子字符串的出现次数
【发布时间】:2018-07-17 14:19:56
【问题描述】:

我正在使用两个数据帧,一个包含玩家列表,另一个包含来自另一个数据帧的玩家的逐个播放数据。这两个数据帧中感兴趣的部分行如下所示。

0          Matt Carpenter
1           Jason Heyward
2           Peter Bourjos
3           Matt Holliday
4          Jhonny Peralta
5              Matt Adams
...
Name: Name, dtype: object


0     Matt Carpenter grounded out to second (Grounder).
1               Jason Heyward doubled to right (Liner).
2     Matt Holliday singled to right (Liner). Jason Heyward scored.
...
Name: Play, dtype: object

我要做的是在第一个数据帧中创建一个列,该列计算另一个数据帧中该列中字符串 (df['Name'] + 'scored') 的出现次数。例如,它会搜索“马特卡彭特得分”、“杰森海沃德得分”等实例。我知道你可以使用 str.contains 来做这种事情,但它似乎只有在你输入明确的情况下才有效细绳。例如,

batter_game_logs_df['R vs SP'] = len(play_by_play_SP_df[play_by_play_SP_df['Play'].str.contains('Jason Heyward scored')].index)

工作正常,但如果我尝试

batter_game_logs_df['R vs SP'] = len(play_by_play_SP_df[play_by_play_SP_df['Play'].str.contains(batter_game_logs_df['Name'].astype(str) + ' scored')].index)

它返回错误“系列”对象是可变的,因此它们不能被散列。我已经查看了各种类似的问题,但无法为我的一生找到解决这个问题的方法。对此的任何帮助将不胜感激,谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为需要通过正则表达式 findall 并加入 Name 的所有值,然后通过 MultiLabelBinarizer 创建指标列并通过 reindex 添加所有缺少的列:

    s = df1['Name'] + ' scored'
    pat = r'\b{}\b'.format('|'.join(s))
    
    from sklearn.preprocessing import MultiLabelBinarizer
    
    mlb = MultiLabelBinarizer()
    df = pd.DataFrame(mlb.fit_transform(df2['Play'].str.findall(pat)),
                      columns=mlb.classes_, 
                      index=df2.index).reindex(columns=s, fill_value=0)
    print (df)
    Name  Matt Carpenter scored  Jason Heyward scored  Peter Bourjos scored  \
    0                         0                     0                     0   
    1                         0                     0                     0   
    2                         0                     1                     0   
    
    Name  Matt Holliday scored  Jhonny Peralta scored  Matt Adams scored  
    0                        0                      0                  0  
    1                        0                      0                  0  
    2                        0                      0                  0  
    

    必要时最后joindf1

    df = df2.join(df)
    print (df)
                                                    Play  Matt Carpenter scored  \
    0  Matt Carpenter grounded out to second (Grounder).                      0   
    1            Jason Heyward doubled to right (Liner).                      0   
    2  Matt Holliday singled to right (Liner). Jason ...                      0   
    
       Jason Heyward scored  Peter Bourjos scored  Matt Holliday scored  \
    0                     0                     0                     0   
    1                     0                     0                     0   
    2                     1                     0                     0   
    
       Jhonny Peralta scored  Matt Adams scored  
    0                      0                  0  
    1                      0                  0  
    2                      0                  0  
    

    【讨论】:

    • 这按您描述的方式工作(但是我不完全理解正则表达式发生了什么 - 我将更深入地研究它以弄清楚这一点),但是我将如何总结这些事件在 df1 的列中?因此,在球员姓名列旁边,我将有一列,其中 0 对应于马特·卡彭特,1 对应于杰森·海沃德,依此类推。
    • 谢谢,它有效!不一定是最漂亮的方法,但它可以完成工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    • 2022-01-06
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    相关资源
    最近更新 更多