我需要一些技巧来进行计算。
我有一个如下所示的DataFrame:
text_id user date important_words
1 John 2018-01-01 {cat, dog, puppy}
1 John 2018-02-01 {cat, dog}
2 Anne 2018-01-01 {flower, sun}
3 John 2018-03-01 {water, blue}
3 Marie 2018-05-01 {water, blue, ocean}
3 Kate 2018-08-01 {island, sand, towel}
4 Max 2018-01-01 {hot, cold}
4 Ethan 2018-06-01 {hot, warm}
5 Marie 2019-01-01 {boo}
在给定的数据框中:
text_id
是指文本的ID:具有不同ID的每个文本都是不同的文本。 user
列是指已编辑文本(添加和删除重要单词)的用户的名称。 date
列是指进行编辑的时间(请注意,对每个文本的编辑都是临时排序的)。最后,important_words
列是用户编辑后文本中出现的一组重要单词。
我需要计算每个页面的每个版本上每个用户添加了多少个单词。
此处的预期输出为:
text_id user date important_words added_words
1 John 2018-01-01 {cat, dog, puppy} 3
1 John 2018-02-01 {cat, dog} 0
2 Anne 2018-01-01 {flower, sun} 2
3 John 2018-03-01 {water, blue} 2
3 Marie 2018-05-01 {water, blue, ocean} 1
3 Kate 2018-08-01 {island, sand, towel} 3
4 Max 2018-01-01 {hot, cold} 2
4 Ethan 2018-06-01 {hot, warm} 1
5 Marie 2019-01-01 {boo} 1
请注意,第一次编辑文本是创建,因此添加的单词数始终是在这种情况下设置的important_words
的大小。
任何关于最快计算added_words
列的技巧都将受到赞赏。
请注意,important_words
列包含一组,因此计算两个连续版本之间的差异的操作应该很容易。
答案 0 :(得分:2)
很难思考,但很有趣:-)我正在使用get_dummies
,然后我们只保留每列的第一个1
值,sum
s=df.important_words.map(','.join).str.get_dummies(sep=',')
s.mask(s==0).cumsum().eq(1).sum(1)
Out[247]:
0 3
1 0
2 2
3 2
4 1
5 3
6 2
7 1
8 1
dtype: int64
df['val']=s.mask(s==0).cumsum().eq(1).sum(1)
更新
s=df.important_words.map(','.join).str.get_dummies(sep=',')
s.mask(s==0).groupby(df['text_id']).cumsum().eq(1).sum(1)