【问题标题】:Determining when a column value changes in pandas dataframe确定熊猫数据框中的列值何时更改
【发布时间】:2015-07-23 15:12:09
【问题描述】:

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

例如:

数据框:

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

会告诉我第 2 行和第 3 行之间发生了变化。我知道如何使用 for 循环获取这些值,但我希望有一种更 Pythonic 的方式来解决这个问题。

【问题讨论】:

  • 对不起,你问的是什么时候'A'不等于'B'在同一行?
  • 不抱歉,我只是想知道 B 中的值在哪些行发生了变化。 A 中的值是我想在 B 更改时查看的值,但我让那部分工作。 (我已经更新了 DF,希望能更清楚地说明这一点)

标签: python csv search pandas dataframe


【解决方案1】:

您可以使用它,它会更快,希望对您有所帮助!

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

【讨论】:

    【解决方案2】:

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

    >>> 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_value 可能因您的应用程序而异。

    【讨论】:

      【解决方案3】:

      您可以为差异创建一个新列

      > 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
      

      这将是您所需的行

      【讨论】:

      • 如何通过字符串的差异来做到这一点?似乎这个 diff() 只适用于数字。我可以将所有字符串转换为数字...
      • 如果你有嵌入在字符串中的数字,你可以使用类似df['A'].astype(float).diff()
      • 这不适用于“NL5358383”等大字符串。它不能转换为浮点数。
      • @amc 你可以先把字符串映射到int。
      猜你喜欢
      • 1970-01-01
      • 2018-02-20
      • 1970-01-01
      • 2020-08-06
      • 2017-01-16
      • 2023-02-21
      • 1970-01-01
      • 2021-12-29
      • 1970-01-01
      相关资源
      最近更新 更多