计算数据帧中两个连续行之间的集合差

时间:2019-08-14 13:19:26

标签: python pandas set

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

我的数据框如下所示:

text_id     name     date                words
1           John     2018-01-01          {ocean, blue}
1           John     2018-02-01          {ocean, green} 
2           Anne     2018-03-01          {table, chair}
3           Anne     2018-03-01          {hot, cold, warm}
3           Mark     2018-04-01          {hot, cold}
3           Ethan    2018-05-01          {warm, icy}
4           Paul     2018-01-01          {cat, dog, puppy}
4           John     2018-02-01          {cat}
5           Paul     2018-03-01          {cat, sheep, deer}

在文本中,text_id代表特定文本(SAME TEXT_ID = SAME TEXT)。 name列代表已编辑文本的人。 date列代表用户进行编辑的日期。 words列由用户编辑后形成文本的单词组成。

words列是一个集合。我需要添加一个附加列added_words,其中包含对 THE SAME 文本的上一次编辑的设置差异。这是为了检查在同一文本中和一次编辑及其连续两次之间的区别。

此处的示例输出为:

text_id     name     date          words            added_words
1           John     2018-01-01    {ocean,blue}     {ocean, blue}
1           John     2018-02-01    {ocean,green}    {green}
2           Anne     2018-03-01    {table,chair}    {table, chair}
3           Anne     2018-03-01    {hot,cold,warm}  {hot, cold, warm}
3           Mark     2018-04-01    {hot,cold}       {}
3           Ethan    2018-05-01    {warm,icy}       {warm, icy}
4           Paul     2018-01-01    {cat,dog,puppy}  {cat, dog, puppy}
4           John     2018-02-01    {cat}            {}
5           Paul     2018-03-01    {cat,sheep,deer} {cat,sheep,deer}

请注意,基本上,added_words列包含第i行中的word列与第i-1行中的word列之间的设置差异,仅当第i行中的text_id第i-1行是相同的,因为:我只希望SAME文本(相同的text_id)之间的差异,而不是不同的文本。

任何有关此的提示都将非常有帮助。

编辑

要将words列变成一组,请执行以下操作:

  

df ['words'] = df ['words']。str.strip('{}')。str.split(',')。apply(set)

2 个答案:

答案 0 :(得分:1)

既然有了集合,我们可以通过使用shift减去groupby减去它们而得到它们的区别:

df['added_words'] = df.groupby('text_id')\
                      .apply(lambda x: (x['words'] - x['words'].shift()).fillna(x['words']))\
                      .to_numpy()

注意:如果您有pandas < 0.24.0,请使用.values代替to_numpy()


输出

   text_id   name        date               words         added_words
0        1   John  2018-01-01       {blue, ocean}       {blue, ocean}
1        1   John  2018-02-01      {ocean, green}             {green}
2        2   Anne  2018-03-01      {table, chair}      {table, chair}
3        3   Anne  2018-03-01   {hot, warm, cold}   {hot, warm, cold}
4        3   Mark  2018-04-01         {hot, cold}                  {}
5        3  Ethan  2018-05-01         {icy, warm}         {icy, warm}
6        4   Paul  2018-01-01   {cat, puppy, dog}   {cat, puppy, dog}
7        4   John  2018-02-01               {cat}                  {}
8        5   Paul  2018-03-01  {cat, sheep, deer}  {cat, sheep, deer}

答案 1 :(得分:1)

使用difffillnaDiff会进行设置减法

df['added_words'] = df.groupby('text_id').words.diff().fillna(df.words)

In [162]: df
Out[162]:
   text_id   name        date               words         added_words
0        1   John  2018-01-01       {ocean, blue}       {ocean, blue}
1        1   John  2018-02-01      {green, ocean}             {green}
2        2   Anne  2018-03-01      {chair, table}      {chair, table}
3        3   Anne  2018-03-01   {warm, cold, hot}   {warm, cold, hot}
4        3   Mark  2018-04-01         {cold, hot}                  {}
5        3  Ethan  2018-05-01         {warm, icy}         {warm, icy}
6        4   Paul  2018-01-01   {cat, puppy, dog}   {cat, puppy, dog}
7        4   John  2018-02-01               {cat}                  {}
8        5   Paul  2018-03-01  {cat, deer, sheep}  {cat, deer, sheep}