python - 迭代条件追加列表中的数据帧
问题描述
我在 for 循环中将行附加到 pandas DataFrame。我想检查我的 ab 文件中的所有日期变化:
df = pd.DataFrame({'id':[1,1,2,2,3],
'DATE_FIRST':['01/04/2020','01/05/2020','01/05/2020',
'01/06/2020','03/06/2020'],
'DATE_LAST':['05/05/2020','05/05/2020','02/06/2020',
'02/06/2020','05/06/2020']})
id DATE_FIRST DATE_LAST
0 1 01/04/2020 05/05/2020
1 1 01/05/2020 05/05/2020
2 2 01/05/2020 02/06/2020
3 2 01/06/2020 02/06/2020
4 3 03/06/2020 05/06/2020
此示例中的变化是索引 0 处的 ID :1 其 DATE_LAST 大于索引 1 的 DATE_FIRST。另一方面,ID 2 相同,ID 3 是正确的。
对于df,循环的结果应该是这样的:
id DATE_FIRST DATE_LAST
1 01/04/2020 05/05/2020
2 01/05/2020 02/06/2020
3 03/06/2020 05/06/2020
列表结果的结果:
[1,2]
目标是在列表结果中输出任何具有异常的 id ,当然还要纠正差异并返回一个干净的文件df。
阿诺姆
任何人都可以强调我缺少什么来使附加语句起作用吗?这是我试图做的:
def absence (df):
i = 2
result=[]
line=[]
while i <= len(df):
for i in df.id :
if df["DATE_FIRST"].iloc[i-1] <= df["DATE_FIRST"].iloc[i] <= df["DATE_LAST"].iloc[i-1]:
if df["DATE_LAST"].iloc[i] <= df["DATE_LAST"].iloc[i-1]:
result=result.append(int(df.index[i]))
df=df.drop(df.index[i])
i = i - 1
elif df["DATE_LAST"].iloc[i] > df["DATE_LAST"].iloc[i-1]:
line= (df["DATE_LAST"].iloc[i-1] == df["DATE_LAST"].iloc[i])
result=result.append(int(df.index[i]))
del(line)
i = i - 1
else:
i = i + 1
break
return(result)
return(df)
解决方案
你的异常对我来说并不完全清楚,但这样的解决方案应该能让你朝着正确的方向前进。
我的猜测也是您想查看每个 ID。
我正在使用.shift()查看上一行。
使用 pandas 时要记住一件事:尽量不要使用 for 循环,它们确实会使事情变慢。
代码的工作示例:
import numpy as np
import pandas as pd
df = pd.DataFrame({
'id':[1, 1, 2, 2],
'DATE_FIRST':['01/04/2020','01/05/2020','01/05/2020','01/06/2020'],
'DATE_LAST':['05/05/2020','05/05/2020','02/06/2020','02/06/2020'],
})
df['DATE_FIRST'] = pd.to_datetime(df['DATE_FIRST'], dayfirst=True)
df['DATE_LAST'] = pd.to_datetime(df['DATE_LAST'], dayfirst=True)
df = df.sort_values(by=['id', 'DATE_FIRST', 'DATE_LAST'])
df['previous_date_first'] = df.groupby('id')['DATE_FIRST'].transform('shift')
df['previous_date_last'] = df.groupby('id')['DATE_LAST'].transform('shift')
rows_to_delete = (
(df['DATE_FIRST'] > df['previous_date_first'])
& (df['DATE_LAST'] <= df['previous_date_last'])
)
df[~rows_to_delete]
id DATE_FIRST DATE_LAST
0 1 2020-04-01 2020-05-05
2 2 2020-05-01 2020-06-02
推荐阅读
- php - 如何在 Laravel 中使用标准的 php 包?我尝试导入它但找不到它?
- typescript - create-react-app 使用 TypeScript 编译器做什么?
- tensorflow - 这个 TensorFlow 类的用例是什么:image.flip_up_down?
- android - PJSUA2 Android - 来电在 32 秒后掉线
- python - “import foo.bar”和“import foo”的区别?
- c++ - 链表从原始指针创建 shared_ptr
- c - 客户端断开连接后 C 套接字 TCP 服务器失败
- java - Servlet 和 jsp,显示本地目录中的图像列表时出错
- python - log(n!) 的向量化计算
- node.js - 如何使用 Cloud Functions 中的“onFinalize”将 300Mb JSON 文件从 Firebase 存储导入数据库?