Python 确定数据帧中的列值何时更改

Python 确定数据帧中的列值何时更改,python,csv,search,pandas,dataframe,Python,Csv,Search,Pandas,Dataframe,我希望编写一个快速脚本,该脚本将通过包含两列的csv文件运行,并为我提供列B中的值从一个值切换到另一个值的行: 例如: 数据帧: # | A | B --+-----+----- 1 | 2 | 3 2 | 3 | 3 3 | 4 | 4 4 | 5 | 4 5 | 5 | 4 您会告诉我更改发生在第2行和第3行之间。我知道如何使用for循环来获取这些值,但我希望有一种更具python风格的方法来解决这个问题。您可以创建一个新的列来解决这个问题 >

我希望编写一个快速脚本,该脚本将通过包含两列的csv文件运行,并为我提供列B中的值从一个值切换到另一个值的行:

例如:

数据帧:

# |  A  |  B  
--+-----+-----
1 |  2  |  3
2 |  3  |  3
3 |  4  |  4
4 |  5  |  4
5 |  5  |  4

您会告诉我更改发生在第2行和第3行之间。我知道如何使用for循环来获取这些值,但我希望有一种更具python风格的方法来解决这个问题。

您可以创建一个新的列来解决这个问题

> df['C'] = df['B'].diff()
> print df
   #  A  B   C
0  1  2  3 NaN
1  2  3  3   0
2  3  4  4   1
3  4  5  4   0
4  5  5  4   0

> df_filtered = df[df['C'] != 0]
> print df_filtered
   #  A  B  C
2  3  4  4  1

这将显示所需的行

您可以执行以下操作,这也适用于非数值:

>>> import pandas as pd
>>> df = pd.DataFrame({"Status": ["A","A","B","B","C","C","C"]})
>>> df["isStatusChanged"] = df["Status"].shift(1, fill_value=df["Status"].head(1)) != df["Status"]
>>> df
  Status  isStatusChanged
0      A            False
1      A            False
2      B             True
3      B            False
4      C             True
5      C            False
6      C            False
>>> 


请注意,
fill\u值
可能会因应用程序的不同而有所不同。

您可以使用此选项,速度更快,希望有帮助

my_column_changes = df["MyStringColumn"].shift() != df["MyStringColumn"]

对不起,您是在询问同一行上“A”何时不等于“B”吗?不,对不起,我只是想知道B中的值在哪些行发生变化。A中的值是我想在B发生变化时看到的,但我让该部分工作。(我已经更新了DF,希望能更清楚地说明这一点)如何处理字符串的差异?这个diff()似乎只适用于数字。我可以将所有字符串转换为数字…如果您有嵌入字符串中的数字,您可以使用类似
df['A'].astype(float).diff()
这不适用于大型字符串,如“NL5358383”。无法将其转换为浮点。@amc您可以先将字符串映射为int。