我的数据框是这样的:
id ` text c1
1 Hello world how are you people 1
2 Hello people I am fine people 1
3 Good Morning people 0
4 Good Evening 0
现在,我想找到以其他方式使用的最常见词,让我解释一下。
让我先向您展示预期的输出,然后我将解释:
Hello - 2
People - 1
world - 1
how - 1
are - 1
you - 1
I - 1
am - 1
fine - 1
我要说的是:这里people
在3行中是3次。但是该计数在输出中仅显示1。因为:
第1行包含people
和c1
= 1
第2行包含people
和c1
= 1
第3行包含people
和c1
= 0
所以row1 + row2-row3 = 1(因为row1和row2的值为1,而row3为0)
以同样的方式,Hello
的值在输出中为2,因为
第1行包含hello
和c1
= 1
第2行包含hello
和c1
= 1
所以row1 + row2 = 2
我不想创建新的输出列,只想打印它。
我正在用它来计算最常用的单词
print(pd.Series(' '.join(df['text']).lower().split()).value_counts()[:10])
但是idk如何用我的方式计算事物
答案 0 :(得分:2)
您可以将defaultdict
用于存储值-第一个zip列与ci
,用Counter
循环,并在c1 == 0
添加负数的情况下添加。
在字典理解中,最后一次过滤器仅对正数或0
进行计数:
from collections import Counter, defaultdict
zipped = zip(df['text'], df['c1'])
d = defaultdict(int)
for a, b in zipped:
c = Counter(set(a.lower().split()))
for k, v in c.items():
if b == 0:
v = -v
d[k] += v
d = {k: v for k, v in d.items() if v > 0}
print (d)
{'are': 1, 'hello': 2, 'how': 1,'people': 1, 'world': 1, 'you': 1, 'i': 1, 'am': 1, 'fine': 1}
如果对c1
中的值进行了排序,则类似的解决方案-首先是所有1
,然后是所有0
:
from collections import Counter, defaultdict
df = df.sort_values('c1', ascending=False)
zipped = zip(df['text'], df['c1'])
d = defaultdict(int)
for a, b in zipped:
c = Counter(set(a.lower().split()))
for k, v in c.items():
if (b == 0) and (k in d):
d[k] -= v
elif (b == 1):
d[k] += v
print (d)
defaultdict(<class 'int'>, {'are': 1, 'hello': 2, 'how': 1, 'people': 1,
'world': 1, 'you': 1, 'i': 1, 'am': 1, 'fine': 1})
df = pd.DataFrame({'val': list(d.keys()),
'No': list(d.values())}).sort_values('No', ascending=False)
print (df)
val No
1 hello 2
0 are 1
2 how 1
3 people 1
4 world 1
5 you 1
6 i 1
7 am 1
8 fine 1
s = pd.Series(d).sort_values(ascending=False)
print (s)
hello 2
fine 1
am 1
i 1
you 1
world 1
people 1
how 1
are 1
dtype: int64