Python Pandas 条件无法准确识别行
Posted
技术标签:
【中文标题】Python Pandas 条件无法准确识别行【英文标题】:Python Pandas condition fails to identify rows accurately 【发布时间】:2018-08-20 01:28:13 【问题描述】:这是来自 jupyter notebook 的输入和输出。我需要帮助确定我无法准确选择和设置“went_out”列中的数据的原因。
两个红色下划线单元格都应该显示其所在行的日期时间列中的数据,但只有一个单元格准确地显示了它。事实证明,许多符合我条件的行没有被选中和设置。
这是我使用的代码示例:
# your answer here
df.loc[(df['reading_type'] == 'motion') & (df['value'] == 255), 'event'] = 'motion on'
df.loc[(df['reading_type'] == 'motion') & (df['value'] == 0), 'event'] = 'motion off'
df2 = df.loc[(df['reading_type'] == 'door') | (df['event'] == 'motion on')].copy()
df2.loc[(df['event'] == 'door close') & (df['event'].shift(-1) == 'door open'), 'went_out'] = df2['datetime']
df2
这里是 jupyter notebook 文件和 csv 文件的链接:
Jupyter 笔记本: https://drive.google.com/file/d/15f6NQrM4UoAZlzRhK35TOKyhPJnmWWdU/view?usp=sharing
CSV 文件: https://drive.google.com/file/d/1hZudSVbT91ESj2qkzrJ--CbVdrzVCmce/view?usp=sharing
【问题讨论】:
你可以试试df2.loc[( (df['event'] == 'door close') & (df['event'].shift(-1) == 'door open') ), 'went_out'] = df2['datetime']
。我已将选择条件添加到一个 () 而不是 2 个单独的。
@manoj 不,我刚试过,它仍然给出相同的输出。
@Benjamin 你能提供样本数据(在 csv 中),以便我可以在本地进行测试。
@BhaveshGhodasara 好的,我已经在帖子底部添加了谷歌驱动器链接。
我刚刚意识到我犯了一个错误。我应该在 df2 而不是 df 上进行调节。现在可以了。
【参考方案1】:
据我了解,您正在尝试写门关闭的日期和时间。这可能是您想要的解决方案的一部分。您可以只使用关门条件来索引“went_out”列,而不是寻找门打开然后关闭的条件。
df.loc[(df['reading_type'] == 'door') & (df['value'] == 255), 'event'] = 'door on'
df.loc[(df['reading_type'] == 'door') & (df['value'] == 0), 'event'] = 'door off'
df2 = df[df['reading_type'] == 'door'].copy()
# The line below is modified
df2.loc[df2['event'] == 'door off', 'went_out'] = df2[df2['event'] == 'door off']['datetime']
print(df2)
输出如下:
id datetime device location reading_type value event went_out
284 284 2018-01-01 07:57:56 Door door door 255.0 door on NaN
285 285 2018-01-01 07:58:12 Door door door 0.0 door off 2018-01-01 07:58:12
294 294 2018-01-01 08:29:25 Door door door 255.0 door on NaN
295 295 2018-01-01 08:29:38 Door door door 0.0 door off 2018-01-01 08:29:38
357 357 2018-01-01 09:16:38 Door door door 255.0 door on NaN
361 361 2018-01-01 09:17:40 Door door door 0.0 door off 2018-01-01 09:17:40
希望这有帮助。
编辑 获取开门后关门的日期和时间的条件
df2.loc[((df2['event'].shift(-1) == 'door on') & (df2['event']=='door off') ), 'went_out'] = df2[df2['event']=='door off']['datetime']
print(df2[df2['event'] == 'door off'])
id datetime device location reading_type value event went_out
285 285 2018-01-01 07:58:12 Door door door 0.0 door off 2018-01-01 07:58:12
295 295 2018-01-01 08:29:38 Door door door 0.0 door off NaN
361 361 2018-01-01 09:17:40 Door door door 0.0 door off 2018-01-01 09:17:40
509 509 2018-01-01 15:50:46 Door door door 0.0 door off 2018-01-01 15:50:46
如果这能解决您的问题,请告诉我。
【讨论】:
是的,没错。但问题是,有时门是关着的,但仍然有“动作”,这意味着房子里正在发生活动。居民有时可以关上门,但仍然在房子里。所以我寻找:1.关门 2.关门和开门之间不能有动作 3.开门(回家) 关门 -> 开门 == 离开家回家。关门 -> 运动 -> 开门 == 关门但仍在家里。 检查编辑解决方案。 谢谢。顺便说一句,关门后门打开。似乎工作。我回家后会尝试,如果有效,我会在这里发布:) 我很高兴能帮上忙 :)。对于解决方案,我觉得当我们设置值时,它应该是df2[((df2['event'].shift(-1) == 'door on') & (df2['event']=='door off') )]['datetime']
,因为我们只想为同时满足这两个条件的索引设置'went_out'。你怎么看?以上是关于Python Pandas 条件无法准确识别行的主要内容,如果未能解决你的问题,请参考以下文章
实战案例!用1行Python代码识别身份证信息,准确率超过99%,YYDS