遍历条件追加列表中的数据框

时间:2020-11-05 08:50:21

标签: python pandas

我在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)

1 个答案:

答案 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