簡體   English   中英

值 Pandas Dataframe 列中的項目計數,其中包含字符串列表作為值

[英]Value Counts of items inside a column in Pandas Dataframe which contains list of string as value

我想計算數據集列中存在的列表中項目的出現次數。 我在數據集中有我的標簽列。 我的數據集包含以下格式的數據

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

Output 將

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)

Output 將

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

但價值計數不適用於上述系列。 值計數將給出以下 output

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

方法2:我嘗試使用replace、strip、asl.literal_eval()。

Question如何實現output 格式如下?

python 2
symfony 1
assestic 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)行的方法相同。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM