Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:基于行中的值与列添加的日期比较_Python_Excel_Date_Pandas - Fatal编程技术网

Python 熊猫:基于行中的值与列添加的日期比较

Python 熊猫:基于行中的值与列添加的日期比较,python,excel,date,pandas,Python,Excel,Date,Pandas,我有许多excel文件,其格式类似: |name| email| cat1| cat2| cat3 smith email 01JAN2016 01JAN2014 01JAN2015 前两列包含字符串(姓名和电子邮件地址),而以下每列都包含每个人完成cat(x)中每个项目的日期 我想运行与当前日期的比较,添加一个新的列“status”,根据行中的任何日期是否早于当前日期,该列的值将为“compliant”或“拖欠”,然后将新数据框输出到excel电子表格 我最初的尝试让我可以很容易地过滤“较

我有许多excel文件,其格式类似:

|name| email| cat1| cat2| cat3
 smith email 01JAN2016 01JAN2014 01JAN2015
前两列包含字符串(姓名和电子邮件地址),而以下每列都包含每个人完成cat(x)中每个项目的日期

我想运行与当前日期的比较,添加一个新的列“status”,根据行中的任何日期是否早于当前日期,该列的值将为“compliant”或“拖欠”,然后将新数据框输出到excel电子表格

我最初的尝试让我可以很容易地过滤“较旧”的日期,但是,当我尝试使用条件添加列时,一切都开始中断:

import pandas as pd
import numpy as np
import datetime

current_date = datetime.datetime.now()
writer = pd.ExcelWriter('pd_output.xlsx', engine='xlsxwriter', datetime_format= 'mmm d yyy')

df = pd.read_excel(tracker,'Sheet1')

print(df.values)    # Displays dates as 'Timestamp('2016-01-01 00:00:00') any value which is < current_date displays as 'True' else 'False'

print(df < current_date)  # removes dates that are not older than current_date but does not delete column, ie someone with no old dates will still show up with column 3+ being blank

# a couple version of what I have been trying - unsuccessfully
df['Status'] = np.where(df[df < current_date], 'delinquent', 'compliant'  # error: 'wrong number of items passed

df['Status'] = np.where(df == 'True', 'delinquent', 'compliant'  # error: 'str' obj has no attr 'view'  

df['Status' = df.Set.map(lambda x: 'delinquent' if 'True' in df else 'compliant'  # from another post - error 'no attr 'Set' or 'map'

  # send to output excel
  df.to_excel(writer,sheet_name='Sheet1')
将熊猫作为pd导入
将numpy作为np导入
导入日期时间
当前日期=datetime.datetime.now()
writer=pd.ExcelWriter('pd\u output.xlsx',engine='xlsxwriter',datetime\u格式='mmm d yyy')
df=pd.read\u excel(跟踪器,'Sheet1')
打印(df.values)#将日期显示为'Timestamp('2016-01-01 00:00:00')任何小于当前日期的值显示为'True'或'False'
打印(df

我希望有一个输出,它要么显示行,并添加“状态”列,显示行中哪里有“违规日期”-以“符合”或“拖欠”引爆。我感觉我的比较不正确(使用True而不是另一个。where)但是似乎做得不对。

当您想基于一个或多个其他列的值创建一个新列时,您通常使用一个
apply
函数。当该函数是多个列时,就像这里的情况一样,您可以使用。以下是我认为您正在尝试执行的近似操作:

df['Status'] = df.apply (
    lambda df : (
      'delinquent' 
          if any (df[i] < current_date for i in ("cat1","cat2","cat3")) 
       else 'compliant'
    ) ,
    axis = 1
)

这样做的基本原理是函数更简单,并且没有
axis
参数。因此,一般情况下,人们使用
系列。当他们只应用一列函数时应用
,如果函数有多列,则应用

这正是我所希望的。我真的很感激您的时间和添加的解释(为了我将来的教化)。我很高兴您能够解释我的问题,尽管我无法雄辩地表达我的问题。干杯!很高兴能提供帮助!我很高兴我添加的其他内容也很有帮助-
应用
绝对是一个有用的工具。感谢您的接受。
df['Status'] = df['cat1'].apply (
    lambda x : 'delinquent' if x < current_date else 'compliant' 
)