确定熊猫数据框中的列值何时更改
Posted
技术标签:
【中文标题】确定熊猫数据框中的列值何时更改【英文标题】: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,希望能更清楚地说明这一点) 【参考方案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。以上是关于确定熊猫数据框中的列值何时更改的主要内容,如果未能解决你的问题,请参考以下文章