如何在另一列中通过某种公式查找最常用的单词

时间:2019-04-03 04:01:59

标签: pandas dataframe

我的数据框是这样的:

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行包含peoplec1 = 1 第2行包含peoplec1 = 1 第3行包含peoplec1 = 0

所以row1 + row2-row3 = 1(因为row1和row2的值为1,而row3为0)

以同样的方式,Hello的值在输出中为2,因为

第1行包含helloc1 = 1 第2行包含helloc1 = 1

所以row1 + row2 = 2

我不想创建新的输出列,只想打印它。

我正在用它来计算最常用的单词

print(pd.Series(' '.join(df['text']).lower().split()).value_counts()[:10])

但是idk如何用我的方式计算事物

1 个答案:

答案 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