列,该列取决于计算groupby对象中两个列单元格之间的差异

时间:2019-08-13 14:14:35

标签: python pandas dataframe set

我需要一些技巧来进行计算。

我有一个如下所示的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列包含一组,因此计算两个连续版本之间的差异的操作应该很容易。

1 个答案:

答案 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)