Python 计算每个单词出现的不同行数
我有一个包含字符串的Pandas数据帧(或者一个系列,因为我只使用了一列)。我还有一个单词表。对于列表中的每个单词,我想检查它至少出现一次的行数。例如: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"
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对提供的样本数据进行测试的