Python 如何计算pandas列(字符串列表)中的值?

Python 如何计算pandas列(字符串列表)中的值?,python,pandas,Python,Pandas,我有一个dataframe列,它是字符串列表: df['colors'] 0 ['blue','green','brown'] 1 [] 2 ['green','red','blue'] 3 ['purple'] 4 ['brown'] 我想得到的是: 'blue' 2 'green' 2 'brown' 2 'red' 1 'purple' 1 [] 1 在不

我有一个dataframe列,它是字符串列表:

df['colors']

0              ['blue','green','brown']
1              []
2              ['green','red','blue']
3              ['purple']
4              ['brown']
我想得到的是:

'blue' 2
'green' 2
'brown' 2
'red' 1
'purple' 1
[] 1
在不知道自己在做什么的情况下,我甚至数了整个专栏中的人物

b 5
[ 5
] 5 
等等


我觉得这很酷,但解决这个问题的方法让我不知所措

使用一个
计数器
+
,它就是要这样做的。然后从计数器对象构造序列

import pandas as pd
from collections import Counter
from itertools import chain

s = pd.Series([['blue','green','brown'], [], ['green','red','blue']])

pd.Series(Counter(chain.from_iterable(s)))
#blue     2
#green    2
#brown    1
#red      1
#dtype: int64

虽然
explode
+
value\u计数
是熊猫做事情的方式,但对于较短的列表,它们的速度较慢

import perfplot
import pandas as pd
import numpy as np

from collections import Counter
from itertools import chain

def counter(s):
    return pd.Series(Counter(chain.from_iterable(s)))

def explode(s):
    return s.explode().value_counts()

perfplot.show(
    setup=lambda n: pd.Series([['blue','green','brown'], [], ['green','red','blue']]*n), 
    kernels=[
        lambda s: counter(s),
        lambda s: explode(s),
    ],
    labels=['counter', 'explode'],
    n_range=[2 ** k for k in range(17)],
    equality_check=np.allclose,  
    xlabel='~len(s)'
)

您可以使用
集合
模块中的
计数器

import pandas as pd
from collections import Counter
from  itertools import chain

df = pd.DataFrame({'colors':[['blue','green','brown'],
                             [],
                             ['green','red','blue'],
                             ['purple'],
                             ['brown']]})

df = pd.Series(Counter(chain(*df.colors)))

print (df)
输出:

blue      2
green     2
brown     2
red       1
purple    1
dtype: int64

我想,一个快速而肮脏的解决方案应该是这样的

不过,您仍然需要添加一个条件才能获得空列表

colors = df.colors.tolist()
d = {}
for l in colors:
    for c in l:
        if c not in d.keys():
            d.update({c: 1})
        else:
            current_val = d.get(c)
            d.update({c: current_val+1})
这将生成一个如下所示的词典:

{'blue': 2, 'green': 2, 'brown': 2, 'red': 1, 'purple': 1}
解决方案 最佳选项
df.colors.explode().dropna().value\u counts()

但是,如果您还希望对空列表进行计数(
[]
),请使用类似于注释中建议的方法-1.B/C

您可以使用以下两种方法中的任意一种

  • 方法1:单独使用方法⭐⭐⭐
    explode-->dropna-->值\u计数

  • 方法2:使用
    list.extend-->pd.Series.value\u计数
##方法1
#A.如果您不希望计数为空[]
df.colors.explode().dropna().value_counts()
#B.如果您想要空[](分类为NaN)的计数
df.colors.explode().value_counts(dropna=False)#将[]返回为Nan
#C.如果您想要空[](分类为[])的计数
df.colors.explode()
##方法2
颜色=[]
_=[颜色。如果len(e)>0,在df.colors中为e扩展(e)]
pd.系列(颜色).值_计数()
输出

绿色2 蓝色2 棕色2 红色1 紫色1 #方法1.B的NaN 1## #[]1##对于方法1.C 数据类型:int64 虚拟数据
将熊猫作为pd导入
df=pd.DataFrame({'colors':[['blue','green','brown',],
[],
[‘绿色’、‘红色’、‘蓝色’],
[‘紫色’],
['brown']]})

我会使用
。将
pd.Series
一起应用来完成以下操作:

# 1. Expand columns and count them
df_temp = df["colors"].apply(pd.Series.value_counts)

    blue    brown   green   purple  red
0   1.0 1.0 1.0 NaN NaN
1   NaN NaN NaN NaN NaN
2   1.0 NaN 1.0 NaN 1.0
3   NaN NaN NaN 1.0 NaN
4   NaN 1.0 NaN NaN NaN

# 2. Get the value counts from this:
df_temp.sum()

blue      2.0
brown     2.0
green     2.0
purple    1.0
red       1.0

# Alternatively, convert to a dict
df_temp.sum().to_dict()
# {'blue': 2.0, 'brown': 2.0, 'green': 2.0, 'purple': 1.0, 'red': 1.0}

df['colors'].explode().value_counts()
?请发布
df
@vaeinoe请查看此解决方案。
explode
方法的有用解决方案@谢谢你指出这一点。更正了。请检查一下。@ VaEuess请考虑<代码>表决和<代码>接受< /代码>解决方案,如果适用的话。非常感谢。