比较列pandas中的两行中的非数字值



我问了这个问题,提供的答案对我来说非常有效。

比较列中两行的值pandas

然而,现在我有一个类似的任务,比较来自同一列的两行的值,但这一次,列是非数字的。简而言之,我的df是这样的

color          char               days                text
1         red          light                 7                 good
2         red          light                30                 good
3         red         medium                60                  bad
4         blue          dark                 7                  bad
5         blue         light                30                 good
6         blue         light                60                  bad
7        yellow        light                 7                 good
8        yellow        medium               30                  bad
9        yellow        dark                 60                  bad

基本上,对于每种颜色,我都有7天,30天和60天的char值。请注意,这些并不总是按照我在上面的例子中给出的正确顺序。我现在的任务是比较连续几天的值之间的每个颜色的char值,如果值与之前的值不同,那么在列"text"作为"NA"days 7"类别中的文本是默认的,不能覆盖。

预期的结果:

color          char               days                text
1         red          light                 7                 good
2         red          light                30                 good
3         red         medium                60                  NA
4         blue          dark                 7                  bad
5         blue         light                30                  NA
6         blue         light                60                  bad
7        yellow        light                 7                 good
8        yellow        medium               30                  NA
9        yellow        dark                 60                  NA

我尝试了其他问题的解决方案,有几个变化,但它不适合我。有人能帮我一下吗?我不一定只需要给定解决方案的变化,但任何有效的方法都是值得赞赏的。

您可以尝试groupbycolor然后在每个组中掩码text

df['text'] = (df.sort_values(['color', 'days'])
.groupby('color', as_index=False, group_keys=False)
.apply(lambda g: g['text'].mask(g['char'].ne(g['char'].shift().bfill()), np.nan)))
print(df)
color    char  days  text
1     red   light     7  good
2     red   light    30  good
3     red  medium    60   NaN
4    blue    dark     7   bad
5    blue   light    30   NaN
6    blue   light    60   bad
7  yellow   light     7  good
8  yellow  medium    30   NaN
9  yellow    dark    60   NaN

最新更新