Python 如何计算pandas列(字符串列表)中的值?
我有一个dataframe列,它是字符串列表: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 在不
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请考虑<代码>表决和<代码>接受< /代码>解决方案,如果适用的话。非常感谢。