【问题标题】:Value Counts of items inside a column in Pandas Dataframe which contains list of string as valuePandas Dataframe 中包含字符串列表作为值的列中的项目的值计数
【发布时间】:2021-05-29 18:04:52
【问题描述】:

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

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'>

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

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

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

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

python 2
symfony 1
assestic 1

【问题讨论】:

    标签: python pandas string jupyter-notebook data-preprocessing


    【解决方案1】:

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

    这是一个例子:

    import ast
    
    df = pd.DataFrame({
        "tags": [
            "['symfony', 'assestic']",
            "['java', 'containers', 'kubernetes']",
            "['python', 'pelican']",
            "['python', '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) 行相同。

    【讨论】:

    • 它没有用。我得到了与上面发布的相同的输出。正如我上面所说,该列表似乎在字符串中,因此它不能与该方法正常工作
    • 哦,就像第一个单元格值是字符串 "['symfony', 'assestic']" 而不是实际列表?
    • 是的,它就是这种格式。当我尝试删除外部引号时,内部字符串被连接成一个字符串
    • 我明白了,我对答案进行了更新,这行得通吗?
    猜你喜欢
    • 1970-01-01
    • 2020-08-02
    • 2023-04-10
    • 1970-01-01
    • 1970-01-01
    • 2016-04-16
    • 1970-01-01
    • 2015-07-25
    • 1970-01-01
    相关资源
    最近更新 更多