熊猫:一个字符串在数据框单元格中出现几次?

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

标签: python-3.x string pandas frequency

我相信有一个简单的问题。我有一个熊猫数据框df看起来很像这样:

data = [{"Text" : "Dog", "Dog" : 1},
        {"Text" : "Cat", "Dog" : 0}, 
        {"Text" : "Mouse", "Dog" : 0}, 
        {"Text" : "Dog", "Dog" : 1}]

df = pd.DataFrame(data)

我正在尝试在Text列中搜索许多关键字,并计算它们在每个单元格中出现的次数。结果应该存储在新列中,该列显示找到特定关键字的次数。结果应该像Dog列一样。

我尝试使用pandas str.count。它工作正常。但是,当我尝试将结果存储在新列中时,我遇到了麻烦:

mykewords = ('Cat', 'Mouse')
df['Cat'] = df.Text.str.count("Cat")

我收到以下错误消息:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  if __name__ == '__main__':

我有两个问题:

  1. 我在做什么错,我该如何解决?
  2. 如何遍历mykeywords中的所有关键字并分别获得一列?

非常感谢您提前提供的帮助!

2 个答案:

答案 0 :(得分:2)

只需使用最新版本更新熊猫,然后尝试以下代码。对我来说,这就像一种魅力。

  let user = await User.findOne({ email: req.body.email });

  const token = user.generateAuthToken();

答案 1 :(得分:0)

如果文本中可能有多个值,并且需要计数值:

mykewords = ('Cat', 'Mouse')
for x in mykewords:
    df[x] = df.Text.str.count(x)

更好的解决方案是使用带有Series.str.findallSeries.str.len的单词边界:

for x in mykewords:
    df[x] = df.Text.str.findall(r"\b{}\b".format(x)).str.len()

解决方案的差异:

data = [{"Text" : "Dog Cat Catman", "Dog" : 1},
        {"Text" : "Cat Cat", "Dog" : 0}, 
        {"Text" : "Mouse Cat", "Dog" : 0}, 
        {"Text" : "Dog", "Dog" : 1}]

df = pd.DataFrame(data)
df1 = df.copy()
print (df)
   Dog            Text
0    1  Dog Cat Catman
1    0         Cat Cat
2    0       Mouse Cat
3    1             Dog

mykewords = ('Cat', 'Mouse')

for x in mykewords:
    df[x] = df.Text.str.findall(r"\b{}\b".format(x)).str.len()
print (df)
   Dog            Text  Cat  Mouse
0    1  Dog Cat Catman    1      0 <-not match Catman
1    0         Cat Cat    2      0
2    0       Mouse Cat    1      1
3    1             Dog    0      0

for x in mykewords:
    df1[x] = df1.Text.str.count(x)
print (df1)
   Dog            Text  Cat  Mouse
0    1  Dog Cat Catman    2      0 <-match Catman
1    0         Cat Cat    2      0
2    0       Mouse Cat    1      1
3    1             Dog    0      0