我需要一些技巧来进行计算。
我的数据框如下所示:
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)
答案 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)
使用diff
和fillna
。 Diff
会进行设置减法
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}