python - 比较 2 个连续的行,如果不同则分配递增的值(使用 Pandas)

标签 python pandas dataframe replace compare

我有一个像这样的数据框 df_in:

import pandas as pd
dic_in = {'A':['aa','aa','bb','cc','cc','cc','cc','dd','dd','dd','ee'],
       'B':['200','200','200','400','400','500','700','700','900','900','200'],
       'C':['da','cs','fr','fs','se','at','yu','j5','31','ds','sz']}
df_in = pd.DataFrame(dic_in)

我想按以下方式调查 2 列 A 和 B。 我 2 个连续的 rows[['A','B']] 相等,然后它们被分配一个新值(根据我将要描述的特定规则)。 我举个例子更清楚:如果第一个 row[['A','B']] 等于下面的,那么我设置 1 ;如果第二个等于第三个,那么我将设置 1。每次连续两行不同时,我都会将要设置的值增加 1

结果应该是这样的:

     A    B   C  value
0   aa  200  da      1
1   aa  200  cs      1
2   bb  200  fr      2
3   cc  400  fs      3
4   cc  400  se      3
5   cc  500  at      4
6   cc  700  yu      5
7   dd  700  j5      6
8   dd  900  31      7
9   dd  900  ds      7
10  ee  200  sz      8

你能给我推荐一个聪明的方法来实现这个目标吗?

最佳答案

使用shiftany比较连续的行,使用 True 指示值应该更改的位置。然后用cumsum取累计和获得增加的值(value):

df_in['value'] = (df_in[['A', 'B']] != df_in[['A', 'B']].shift()).any(axis=1)
df_in['value'] = df_in['value'].cumsum()

或者,将其压缩为一行:

df_in['value'] = (df_in[['A', 'B']] != df_in[['A', 'B']].shift()).any(axis=1).cumsum()

结果输出:

     A    B   C  value
0   aa  200  da      1
1   aa  200  cs      1
2   bb  200  fr      2
3   cc  400  fs      3
4   cc  400  se      3
5   cc  500  at      4
6   cc  700  yu      5
7   dd  700  j5      6
8   dd  900  31      7
9   dd  900  ds      7
10  ee  200  sz      8

关于python - 比较 2 个连续的行,如果不同则分配递增的值(使用 Pandas),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40979760/

相关文章:

python - 通过 localhost 访问时无法通过 ip 地址访问 django 应用程序

python - 读取空行之间的列

python - 一种使用脚本对数字进行分组的方法

python - 如何将复杂的字典导入 Pandas ?

python - 如何通过迭代多个值动态创建新的数据框?

python - groupby、apply 和 set 没有按预期运行……这是一个错误吗?

python - 使用 Pandas 读取数据(.dat 文件)

python - SVM - 如何向量化核化克矩阵?

python - 如何不按值而是按值范围合并两个数据框?

python - 在追加到 pandas 数据框时创建新列