【问题标题】:Split a column's values by a special character and group by pandas按特殊字符拆分列的值并按熊猫分组
【发布时间】:2018-09-30 02:20:39
【问题描述】:

我有一个这样的df

Owner   Messages
AAA     (YY) Duplicates
AAA     Missing Number; (VV) Corrected Value; (YY) Duplicates
AAA     (YY) Duplicates
BBB     (YY) Duplicates
BBB     Missing Measure; Missing Number

当我像这样做一个普通的groupby时,

df_grouped = df.groupby([' Owner', 'Messages']).size().reset_index(name='count')
df_grouped

我按预期得到了这个,

    Owner  Messages                                               count
0   AAA   (YY) Duplicates                                           2
1   AAA   Missing Number; (VV) Corrected Value; (YY) Duplicates     1
2   BBB   (YY) Duplicates                                           1
3   BBB   Missing Measure; Missing Number                           1

但是,我需要像 ;Messages 列中这样拆分的东西(所需的输出)。

   Owner    Messages             count
0   AAA    (YY) Duplicates       3
1   AAA    Missing Number        1
2   AAA    (VV) Corrected Value  1
3   BBB    (YY) Duplicates       1
4   BBB    Missing Measure       1
5   BBB    Missing Number        1

到目前为止,根据@LeoRochael 的这个post 的回答,它将Messages 列的值按; 拆分并放入一个列表中。无论如何,拆分后我无法获得个人计数。

任何想法如何获得我想要的输出?

【问题讨论】:

    标签: python-3.x pandas split group-by


    【解决方案1】:
    from collections import Counter
    import pandas as pd
    
    pd.Series(
        Counter([(o, m) for o, M in df.values for m in M.split('; ')])
    ).rename_axis(['Owner', 'Message']).reset_index(name='Count')
    
      Owner               Message  Count
    0   AAA  (VV) Corrected Value      1
    1   AAA       (YY) Duplicates      3
    2   AAA        Missing Number      1
    3   BBB       (YY) Duplicates      1
    4   BBB       Missing Measure      1
    5   BBB        Missing Number      1
    

    【讨论】:

      【解决方案2】:

      你需要取消嵌套你的原始数据框,然后我们只做 group size

      s=df.set_index('Owner').Messages.str.split('; ',expand=True).stack().to_frame('Messages').reset_index()
      s.groupby(['Owner','Messages']).size()
      Out[1213]: 
      Owner  Messages            
      AAA    (VV) Corrected Value    1
             (YY) Duplicates         3
             Missing Number          1
      BBB    (YY) Duplicates         1
             Missing Measure         1
             Missing Number          1
      dtype: int64
      

      【讨论】:

      • 我仍然收到AAA(YY) Duplicates 2 和另一个(YY) Duplicates 1。你似乎得到了 3。我不确定我错过了什么。
      • @i.n.n.m ('; ') 在 ; 之后有一个空格
      • 这里需要expand = True吗?...我是通过df.loc[:, 'Messages'] = df.loc[:, 'Messages'].str.split('; '); df.set_index(['Owner'])['Messages'].apply(pd.Series).stack().reset_index()....到达那里的
      • t@Sotos 如果添加 apply(pd.Series) 我们不需要展开 =True
      • @i.n.n.m yw :-) 快乐编码
      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 2021-10-30
      • 2021-04-28
      • 1970-01-01
      • 2020-06-22
      • 1970-01-01
      • 2021-11-18
      • 2021-05-07
      相关资源
      最近更新 更多