首页 > 解决方案 > 迭代条件追加列表中的数据帧

问题描述

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

标签: pythonpandas

解决方案


你的异常对我来说并不完全清楚,但这样的解决方案应该能让你朝着正确的方向前进。
我的猜测也是您想查看每个 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

推荐阅读