Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算每个单词出现的不同行数_Python_Pandas_Optimization - Fatal编程技术网

Python 计算每个单词出现的不同行数

Python 计算每个单词出现的不同行数,python,pandas,optimization,Python,Pandas,Optimization,我有一个包含字符串的Pandas数据帧(或者一个系列,因为我只使用了一列)。我还有一个单词表。对于列表中的每个单词,我想检查它至少出现一次的行数。例如: words = ['hi', 'bye', 'foo', 'bar'] df = pd.Series(["hi hi hi bye foo", "bye bye bye bye", "bar foo hi bar", "hi bye foo bar"

我有一个包含字符串的Pandas数据帧(或者一个系列,因为我只使用了一列)。我还有一个单词表。对于列表中的每个单词,我想检查它至少出现一次的行数。例如:

words = ['hi', 'bye', 'foo', 'bar']
df = pd.Series(["hi hi hi bye foo",
                "bye bye bye bye",
                "bar foo hi bar",
                "hi bye foo bar"])
在这种情况下,输出应该是

0   hi      3
1   bye     3
2   foo     3
3   bar     2
因为“hi”出现在三个不同的行中(第1行、第3行和第4行),“bar”出现在两行中(第3行和第4行),依此类推

我想出了以下方法:

word_appearances = {}
for word in words:
    appearances = df.str.count(word).clip(upper=1).sum()
    word_appearances.update({word: appearances})

pd.DataFrame(word_appearances.items())

这很好,但问题是我有一个相当长的单词列表(大约40000个),大约30000行要检查,字符串没有我在示例中使用的那么短。当我用真实数据尝试我的方法时,它需要永远运行。有没有更有效的方法可以做到这一点?

尝试列表理解和
str.contains
sum

word_appearances = {}
for word in words:
    appearances = df.str.count(word).clip(upper=1).sum()
    word_appearances[word]= appearances

pd.DataFrame.from_dict(word_appearances,columns=['Frequency'],orient='index')
df_out = pd.DataFrame([[word, sum(df.str.contains(word))] for word in words], 
                       columns=['word', 'word_count'])

Out[58]:
  word  word_count
0   hi           3
1  bye           3
2  foo           3
3  bar           2

我正要发布一个类似的解决方案。你不需要“更新”方法。简单地说“单词外观[单词]=外观”就行了。for循环?如果您只需要行的计数,而不需要每个单词出现的次数,
df.str.contains('hi')。sum()
可能会减少时间!我一直在使用
df…sum()
而不是sum(df…)`但是您的方法在大约一半的时间内运行time@G.Anderson是不是
df.str.contains(word).sum()比
sum(df.str.contains(word))
快?我认为前者在本例中效果更好,因为它是一个Pandas系列,而第二种方法在Python本机列表中效果更好。是吗?@Tendero也让我很惊讶,但在我的测试中它是
.sum()
:1.01毫秒,
sum(…)
:527微秒。当然,这可能会也可能不会很好地扩展,这是使用jupyter中的
timeit
magic对提供的样本数据进行测试的