将字符串列拆分并统计字符出现频率

4

我是一名有用的助手,可以为您进行文本翻译。

我有一个数据集,其中有两列看起来像:

|group| |sequence|
A        BX
A        X
B        SFS
B        BCX
B        BSS*B1S
A        BBX

我希望能有一种方法来对字符进行分组和查找每个字符的频率,得到类似下面的结果:

 |group| |char| |freq|
 A       B       3
 A       X       3
 B       S       5
 ...

这两个评论都很好,我只是好奇是否可以将它们都选为答案。 - Justin
3个回答

5
您可以使用高效的repeat解决方案,然后再使用groupby
from itertools import chain

# Step 1 - flatten your dataframe
df = pd.DataFrame({
    'group' : df['group'].repeat(df.sequence.str.len()), 
    'char' : list(chain.from_iterable(df.sequence.tolist()))
})
# Step 2 - filter out characters and groupby on `group`
df[df.char.str.isalpha()].groupby(['group', 'char']).size().reset_index(name='freq')

  group char  freq
0     A    B     3
1     A    X     3
2     B    B     3
3     B    C     1
4     B    F     1
5     B    S     5
6     B    X     1

4
以下是几种呈现结果的不同方式。
应用 groupby.sum 函数来对字符串进行拼接,之后我们可以使用 pd.value_counts 函数。
df = pd.DataFrame({'group': ['A', 'A', 'B', 'B', 'B', 'A'],
                   'sequence': ['BX', 'X', 'SFS', 'BCX', 'BSS*B1S', 'BBX']})

res = df.groupby('group')['sequence'].sum().map(list).apply(pd.value_counts)\
        .fillna(0).astype(int).reset_index()

res = res.loc[:, res.columns.str.isalpha()]

print(res)

#   group  B  C  F  S  X
# 0     A  3  0  0  0  3
# 1     B  3  1  1  5  1

res2 = pd.melt(res, id_vars=['group']).sort_values(['group', 'variable'])
res2 = res2[res2['value'] != 0].set_index(['group', 'variable'])

#                 value
# group variable       
# A     B             3
#       X             3
# B     B             3
#       C             1
#       F             1
#       S             5
#       X             1

print(res2)

使用 collections.Counter 可以实现更高效的变体:

from collections import Counter

res = df.groupby('group')['sequence'].sum().apply(Counter).apply(pd.Series)\
        .fillna(0).astype(int).reset_index()

1
使用列表推导式创建一个元组列表。
c = pd.value_counts([(g, s) for g, S in df.values for s in S if s.isalpha()])

pd.DataFrame(
    np.column_stack([c.index.tolist(), c.values]),
    columns=df.columns.tolist() + ['freq']
)

  group sequence freq
0     B        S    5
1     A        B    3
2     B        B    3
3     A        X    3
4     B        F    1
5     B        C    1
6     B        X    1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接