Pandas - 从列中计算并获取唯一出现的字符串值

Jer*_*uke 3 python regex split pandas

我有一列有 800 多行,如下所示:

0                            ['Overgrow', 'Chlorophyll']
1                            ['Overgrow', 'Chlorophyll']
2                            ['Overgrow', 'Chlorophyll']
3                               ['Blaze', 'Solar Power']
4                               ['Blaze', 'Solar Power']
5                               ['Blaze', 'Solar Power']
6                               ['Torrent', 'Rain Dish']
7                               ['Torrent', 'Rain Dish']
8                               ['Torrent', 'Rain Dish']
9                            ['Shield Dust', 'Run Away']
10                                         ['Shed Skin']
11                       ['Compoundeyes', 'Tinted Lens']
12                           ['Shield Dust', 'Run Away']
13                                         ['Shed Skin']
14                                   ['Swarm', 'Sniper']
15             ['Keen Eye', 'Tangled Feet', 'Big Pecks']
16             ['Keen Eye', 'Tangled Feet', 'Big Pecks']
17             ['Keen Eye', 'Tangled Feet', 'Big Pecks']
Run Code Online (Sandbox Code Playgroud)

我想要什么?

  1. 我想计算每个字符串值出现的次数。
  2. 我还想将唯一的字符串值排列到一个列表中。

这是我为获得第二部分所做的工作:

list_ability = df_pokemon['abilities'].tolist()
new_list = []
for i in range(0, len(list_ability)):
    m = re.findall(r"'(.*?)'", list_ability[i], re.DOTALL)
    for j in range(0, len(m)):
        new_list.append(m[j])

list1 = set(new_list)  
Run Code Online (Sandbox Code Playgroud)

我能够将唯一的字符串值放入列表中,但有更好的方法吗?

例子:

'过度生长' - 3

'叶绿素' - 3

'火焰' - 3

'Sheild Dust' - 2 .... 等等

(顺便说一下,列的名称'abilities'来自数据框df_pokemon。)

Flo*_*oor 5

由于值是字符串,您可以使用 regex 和 split 将它们转换为列表然后使用 itertools 就像@JonClements 在评论中提到的那样计数即

from collections import Counter
count  = pd.Series(df['abilities'].str.replace('[\[\]\']','').str.split(',').map(Counter).sum())
Run Code Online (Sandbox Code Playgroud)

输出:

大啄木鸟 3
叶绿素3
雨碟 3
逃跑 2
狙击手1
太阳能 3
纠结的脚 3
有色镜片 1
烈焰3
复眼1
敏锐之眼 3
过度生长 3
脱皮 2
盾之尘 2
蜂群 1
洪流3
数据类型:int64
数据类型:int64

为了制作只有唯一值的列表,然后 count[count==1].index.tolist()

['Sniper', 'Tinted Lens', 'Compoundeyes', 'Swarm']
Run Code Online (Sandbox Code Playgroud)

然后制作索引列表

count.index.tolist()
Run Code Online (Sandbox Code Playgroud)