微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Pandas Dataframe 中包含字符串列表作为值的列内项目的值计数

如何解决Pandas Dataframe 中包含字符串列表作为值的列内项目的值计数

我想计算数据集列中列表中项目的出现次数。我在数据集中有我的标签列。 我的数据集包含以下格式的数据

tags
-----------
['symfony' 'assestic]
['java' 'containers' 'kubernetes']
['python' 'pelican']
['python' 'api' 'oath' 'python-requests']
['google-api' 'google-cloud-storage']

该列表似乎也是字符串格式。如果不连接列表中的所有项目,我就无法将字符串转换为列表。

#Checking the type of first 5 rows tags
for i,l in enumerate(df.tags):
    print('list',i,'is class',type(l) )
    if i ==4:
        break

输出将是

list 0 is class <class 'str'>
list 1 is class <class 'str'>
list 2 is class <class 'str'>
list 3 is class <class 'str'>
list 4 is class <class 'str'>

我尝试了两种方法 方法 1:

def clean_tags_list(list_):
    list_ = list_.replace("\"['",'[')
    list_ = list_.replace("']\"",']')
    list_ = list_.replace("'","")
    return list_
df['tags'] = df['tags'].apply(clean_tags_list)

输出将是

   tags                              
   ----------------------------------
   [symfony assestic]                 
   [java containers kubernetes]      
   [python pelican]                  
   [pyton api oath python-requests]   
   [google-api google-cloud-storage]  

但是价值计数不适用于上述系列。 值计数将给出以下输出

[symfony assestic]                 1                
[java containers kubernetes]       1      
[python pelican]                   1                 
[pyton api oath python-requests]   1   
[google-api google-cloud-storage]  1

方法 2: 我尝试使用替换、剥离、asl.literal_eval()。

问题 如何实现以下格式的输出

python 2
symfony 1
assestic 1

解决方法

您可以将列展平,使每个列表元素都位于单独的行中,然后只需使用 .value_counts()。但是,由于数据实际上是看起来像列表的字符串,因此您必须先将它们转换为实际列表。

这是一个例子:

import ast

df = pd.DataFrame({
    "tags": [
        "['symfony','assestic']","['java','containers','kubernetes']","['python','pelican']",'api','oath','python-requests']","['google-api','google-cloud-storage']",]
})

df["tags"]\
    .apply(ast.literal_eval)\ # convert strings to lists
    .apply(lambda x: pd.Series(x))\ # convert lists to series
    .stack()\ # flatten the multiple series into a single series
    .value_counts() # get value counts

结果:

python                  2
java                    1
oath                    1
google-cloud-storage    1
api                     1
assestic                1
kubernetes              1
pelican                 1
symfony                 1
python-requests         1
google-api              1
containers              1

请注意,如果您处理的数据由列表组成,而不是由看起来像列表的字符串组成,则方法是相同的,但没有 .apply(ast.literal_eval) 行。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。