我有一个我想在整个数据框中的特定列中计算单词的数据框。
假设shape
是数据框中的一列:
shape color
circle rectangle orange
square triangle
rombus
square oval black
triangle circle
rectangle oval white
triangle
我想在shape
栏中计算数据框中有多少圆形,矩形,椭圆形和三角形。
输出应为:
circle 2
rectangle 2
triangle 3
oval 1
答案 0 :(得分:2)
使用:
L = ['circle','rectangle','oval','triangle']
s = df['shape'].astype(str).str.split(expand=True).stack()
df = s[s.isin(L)].value_counts().reindex(L, fill_value=0).reset_index()
df.columns = ['vals','counts']
print (df)
vals counts
0 circle 2
1 rectangle 2
2 oval 2
3 triangle 3
说明:
split
个空格(默认分隔符),stack
个单词Series
list
中的值按isin
过滤value_counts
0
添加缺少的值并添加reindex
DataFrame
中的Series
,添加reset_index
答案 1 :(得分:1)
您可以join
的{{1}}列带有空格,并'shape'
作为结果。将其传递给顶级函数split
并使用pandas.value_counts
来将其子集化为您想要看到的形状。
reindex
的优点是,如果reindex
列中没有所需的形状之一,则返回nan
。
'shape'
如果您期望数据集中可能缺少形状,则还可以提供shapes = ['circle','rectangle','oval','triangle']
pd.value_counts(' '.join(df['shape']).split()).reindex(shapes)
circle 2
rectangle 2
oval 2
triangle 3
dtype: int64
填充值。在下面,我选择用reindex
填充它。
0
答案 2 :(得分:0)
分割字符串后,可以将collections.Counter
与itertools.chain
一起使用:
df = pd.DataFrame({'shape': ['circle rectangle', 'square triangle',
'rombus', 'square oval', 'triangle circle',
'rectangle oval', 'triangle']})
from collections import Counter
from itertools import chain
c = Counter(chain.from_iterable(df['shape'].str.split()))
print(c)
Counter({'triangle': 3, 'circle': 2, 'rectangle': 2,
'square': 2, 'oval': 2, 'rombus': 1})
这将提供Counter
对象,该对象是dict
的子类。如果您希望过滤关键字,则可以通过字典理解来实现:
L = {'circle', 'rectangle', 'oval', 'triangle'}
res = {k: v for k, v in c.items() if k in L}
print(res)
{'circle': 2, 'oval': 2, 'rectangle': 2, 'triangle': 3}