我在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)
答案 0 :(得分:1)
您的异常情况对我来说还不是很清楚,但是这样的解决方案应该可以使您朝正确的方向前进。
我的猜测还在于您希望根据每个ID查看此异常。
我正在使用.shift()来查看上一行。
使用熊猫时要记住的一件事:尽量不要使用循环,它们确实会使事情变慢。
工作示例代码:
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