如何过滤列表中的元素并生成频率 table

How to filter elements within a list and generate frequency table

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

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)

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

我希望我的输出有两个 dataframes/tables 如下所示

我们可以在使用 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

你也可以使用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