【问题标题】:How to filter elements within a list and generate frequency table如何过滤列表中的元素并生成频率表
【发布时间】:2021-07-03 14:33:57
【问题描述】:

我有一个如下所示的数据框

df = pd.DataFrame({'text': ["Hi how","I am fine","Ila say Hi"],
                   'tokens':[['Hi','how'],['I','am','fine'],['Ila','say','Hi']],
                    'labels':[['A','B'],['C','B','A'],['D','B','A']]})

我想做两件事

a) 每个标签的计数

b) 计算每个标签下的标记

我正在尝试类似下面的东西

flattened = [] 
op = itertools.zip_longest(df['tokens'],df['labels'])
for i in op:
    for la in df['labels']: 
        if la == 'A' : 
        flattened.append(val)

但这是不正确的,而且无处可去

我希望我的输出有两个数据框/表,如下所示

【问题讨论】:

    标签: python python-3.x pandas dataframe nlp


    【解决方案1】:

    我们可以在使用hstack 扁平化列tokenslabels 之后使用value_counts

    t = np.hstack(df['tokens'])
    l = np.hstack(df['labels'])
    

    每个标签的计数

    pd.value_counts(l)
    
    B    3
    A    3
    D    1
    C    1
    dtype: int64
    

    计算每个标签下的标记

    pd.DataFrame(zip(l, t)).value_counts()
    
    0  1   
    A  Hi      2
       fine    1
    B  am      1
       how     1
       say     1
    C  I       1
    D  Ila     1
    dtype: int64
    

    【讨论】:

      【解决方案2】:

      你也可以使用 Pandas 的explode 方法:

      >>> df2 = df[['labels', 'tokens']].apply(pd.Series.explode)
      >>> df2.labels.value_counts()
      
      B    3
      A    3
      D    1
      C    1
      Name: labels, dtype: int64
      
      >>> df2[['labels', 'tokens']].value_counts()
      labels  tokens
      A       Hi        2
              fine      1
      B       am        1
              how       1
              say       1
      C       I         1
      D       Ila       1
      dtype: int64
      
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-04-28
        • 2017-02-25
        • 1970-01-01
        • 2011-01-10
        相关资源
        最近更新 更多