【问题标题】:How can i find the count of freuency of repeated combination in DataFrame如何在 DataFrame 中找到重复组合的频率计数
【发布时间】:2021-05-09 14:46:41
【问题描述】:

我有一个这个数据集作为样本:

df = pd.DataFrame({'CL1':['A B C','C A N']},
                columns=['CL1','CL2','CL3','CL4']) 
  
     CL1  CL2  CL3  CL4  
0  A B C  NaN  NaN  NaN  
1  C A N  NaN  NaN  NaN  
 
         

我的目标:通过以下步骤在数据框中找到最多重复的单词组合。

    1. 用 (,) 作为分隔符分隔每个值,并添加到 CL2 列中:
     CL1     CL2     CL3  CL4 
0  'A B C'  'A,B,C'  NaN  NaN 
1  'C A N'  'C,A,N'  NaN  NaN 

    1. CL2CL3 中的值分隔:
     CL1     CL2     CL3          CL4 
0  'A B C'  'A,B,C'  'A','B','C'  NaN 
1  'C A N'  'C,A,N'  'C','A','N'  NaN 

     
    1. CL4 列的并集(来自统计的集合论)
     CL1     CL2     CL3          CL4 
0  'A B C'  'A,B,C'  'A','B','C'  [ [A],[B],[C],[A,B],[A,C],[B,C],[A,B,C] ] 
1  'C A N'  'C,A,N'  'C','A','N'  [ [C],[A],[N],[A,C],[C,N],[A,N],[C,A,N] ] 
       
    1. 在新数据框中的新列CL5 中查找列CL4 的每个值的重复并添加到Count
     CL5      Count   
0    [A]       2
1    [B]       1
2    [C]       2
3    [D]       1
4    [N]       1
5    [A,B]     1
etc..

【问题讨论】:

  • 看来你知道你想要什么。如您所想,这是一个多步骤的过程。你做了什么来到达那里? minimal reproducible example?你被困在哪里了?

标签: python pandas dataframe statistics


【解决方案1】:

您可以通过 spacem 按值使用 split,然后为所有组合和计数调用自定义函数,使用 Series.explodeSeries.value_counts

df = pd.DataFrame({'CL1':['A B C','C A N','D E F','F X G']},
                         columns=['CL1','CL2','CL3','CL4']) 


#https://stackoverflow.com/a/5898031/2901002
from itertools import chain, combinations
def all_subsets(ss):
    return chain(*map(lambda x: combinations(ss, x), range(1, len(ss)+1)))    

df = (df['CL1'].apply(lambda x: list(all_subsets(x.split())))
               .explode()
               .value_counts()
               .rename_axis('CL5')
               .reset_index(name='count'))
print (df.head(10))
         CL5  count
0       (C,)      2
1       (F,)      2
2       (A,)      2
3     (E, F)      1
4     (F, G)      1
5     (A, B)      1
6     (C, A)      1
7     (A, C)      1
8  (F, X, G)      1
9       (D,)      1

df['CL5'] = df['CL5'].apply(list)
print (df.head(10))
         CL5  count
0        [C]      2
1        [F]      2
2        [A]      2
3     [E, F]      1
4     [F, G]      1
5     [A, B]      1
6     [C, A]      1
7     [A, C]      1
8  [F, X, G]      1
9        [D]      1

【讨论】:

  • 但我的问题是第 3 步和第 3 步。使用str.split() 我无法将它们彼此分开
  • @Jsmoka - 不明白,在您的解决方案中由, 替换空间,然后由, 分割,在我的解决方案中由空间分割。这不是更好吗?还是有什么原因需要更换?
  • 原因是我从sql变成了DataSet,所以:e.g. ('John,Do') 有时 ('John Do')
  • 是的,我说'John Do'.replace(' ', ',').split(',')'John Do'.split()一样
  • @Jsmoka - 如果需要不按空格分割可以更改数据样本以进行解释,哪些字符串不能分割?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
相关资源
最近更新 更多