【问题标题】:Count keywords in each line of dataframe计算每一行数据框中的关键字
【发布时间】:2019-09-18 05:26:10
【问题描述】:

我想计算我的列表中每个关键字在每行的给定数据框列中出现的数量总和。

d = {
    'Column_1': ['mango pret Orange No manner', ' préts No scan '], 
    'Column_2': ['read priority No', 'This is a priority noir '],
    'Column_3': ['No add', 'yep']
}

df = pd.DataFrame(data=d)

list_1 = ['Apple', 'Mango' ,'Orange', 'pr[éeêè]t[s]?']
list_2 = ['weather', 'r[ea]d' ,'p[wr]iority', 'noir?']
list_3 = ['n[eéè]d','snow[s]?', 'blanc?']

dict = {
    "s1": ['Column_1', list_1],
    "s2": ['Column_1', list_3],
    "s3": ['Column_2', list_2],
    "s4": ['Column_3', list_3],
    "s5": ['Column_2','Column_3',list_1]
}

for elt in list(dict.keys()):
    #s1 s2 s3 print(elt)
    if len(dict[elt])<=2:
        d = Counter(re.findall(r'|'.join(dict[elt][1]).lower(), str(df[dict[elt][0]].str.lower())))
        print(d)
        #df[elt] = d 
        sum(d.values())
    elif len(dict[elt])>2:
        aa = Counter(re.findall(r'|'.join(dict[elt][2]).lower(), str(df[dict[elt][0]].str.lower())))
        bb = Counter(re.findall(r'|'.join(dict[elt][2]).lower(), str(df[dict[elt][1]].str.lower())))
        b = sum(bb.values()) 
        a = sum(aa.values()) 
        d = a +b 
        df[elt] = d

print(d) 的结果在下面

Counter({'mango': 1, 'pret': 1, 'orange': 1, 'préts': 1})

如何更改此代码以提供类似于下面的数据框 df2 的内容

d2 = {'s1': [3, 1], 's3':[2,1]}
df2 = pd.DataFrame(data=d2)

【问题讨论】:

  • 假设list_1 = ['no']dict['s5'] 的输出应该是什么? d2['s5'] = [[1,1],[1,0]] ?
  • 它是 [2, 0] 。因为它在 cloumn_2 的第一行中存在一次,在 column_3 (1+1 = 2) 中存在一次。而且不存在column_2和column_3的第二行所以0。

标签: python regex pandas for-loop


【解决方案1】:
import pandas as pd
import re

d = {
  'Column_1': [u'mango pret Orange No manner', u' préts No scan '], 
  'Column_2': [u'read priority No', u'This is a priority noir '],
  'Column_3': [u'No add', u'yep']
}

df = pd.DataFrame(data=d)

list_1 = [u'Apple', u'Mango' ,u'Orange', u'pr[éeêè]t[s]?' ]
list_2 = [u'weather', u'r[ea]d' ,u'p[wr]iority', u'noir?' ]
list_3 = [u'n[eéè]d',u'snow[s]?', u'blanc?' ]

my_dict = {
  "s1": ['Column_1', list_1],
  "s2": ['Column_1', list_3],
  "s3": ['Column_2', list_2],
  "s4": ['Column_3', list_3],
  "s5": ['Column_2','Column_3',list_1]
}

d2 = dict()
for key, lst in my_dict.items():
  # Distinguish between columns and regex (assuming regex are stored in lists)
  col_names = filter(lambda x: isinstance(x, str), lst)
  regex_lists = filter(lambda x: isinstance(x, list), lst)
  # Concatenate all regex
  regex_list = reduce(lambda x, y: x+y, regex_lists)
  # For the considered columns, apply regex search in each cell and count
  map_function = lambda cell: len(re.findall(r'|'.join(regex_list).lower(), str(cell).lower()))
  df_regex_count = df[col_names].applymap(map_function)
  # Convert to desired output with lists to make a new dataframe
  d2[key] = map(sum, df_regex_count.values.tolist())

df2 = pd.DataFrame(data=d2)

输出:

    s1  s2  s3  s4  s5
0   3   0   1   0   0
1   1   0   2   0   0

请注意,s3 给出 [1, 2] 而不是 [2, 1],因为 r[ea]d 没有捕获 readnoir? 捕获 noir

【讨论】:

  • 谢谢你.. 你能告诉我你在每个单词前加'u'吗?请注意,我的列将从 csv 文件中读取
  • 我使用的是 python 2.7。这是处理 unicode 字符串的方法。否则pr[éeêè]t[s]? 不会捕获préts。如果您使用的是 python 2,请在读取 utf-8 文件时特别小心。
  • 您可以标记为已解决还是需要更多解释?
  • 当我尝试你的代码时,我遇到了这个错误 TypeError: reduce() of empty sequence with no initial value 我试图解决它
  • 如果您复制粘贴此代码,它适用于 python 2.7。如果您执行from functools import reduce,它也适用于python 3。然后,您必须使其适应您的用例。根据您的错误,您必须有一个空的regex_lists。意思是,您必须在my_dict 中有一个值,而您没有 list 正则表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 2022-11-10
  • 2018-01-03
  • 2020-02-12
  • 1970-01-01
  • 2015-10-07
相关资源
最近更新 更多