Python 如何迭代Pandas.DataFrame中的列,并将函数的结果附加到同一行?
我通过以下CSV生成了一个Python 如何迭代Pandas.DataFrame中的列,并将函数的结果附加到同一行?,python,pandas,csv,dataframe,datetime,Python,Pandas,Csv,Dataframe,Datetime,我通过以下CSV生成了一个Pandas.DataFrame: Category,Brand,Product Name,Price,Expiration Date, Package ID,Quantity Cat1,Brand1,Product1,$1000,07/14/2020,XXXXXX,34 我试图在CSV中添加一列,每行对应到期日期的快慢(4表示超过6个月,3表示3到6个月,等等) 我的问题是,当尝试将过期日期列转换为日期时间(使用pandas.to_datetime(df['Expi
Pandas.DataFrame
:
Category,Brand,Product Name,Price,Expiration Date, Package ID,Quantity
Cat1,Brand1,Product1,$1000,07/14/2020,XXXXXX,34
我试图在CSV中添加一列,每行对应到期日期的快慢(4
表示超过6个月,3
表示3到6个月,等等)
我的问题是,当尝试将过期日期
列转换为日期时间(使用pandas.to_datetime(df['Expiration Date'])
)并应用我的classify_Expiration()
函数时,这些类型要么与函数指示的不匹配,要么它试图将函数应用于索引0
,我认为这是标题(因此与%m/%d/%Y
格式不匹配)。在调用.apply()
之前,我已尝试在classification函数内以及在其外部将列转换为datetime。我还尝试使用timedelta
将过期日期与今天的当前日期进行比较,但它不适用于datetime.date.today()
以下是我尝试的第一种方法:
def分类_到期(第行):
一周=时间增量(周=1,天=0,小时=0,分钟=0,秒=0)
如果((一周*0)您需要在days\u之间删除转换为datetime的功能,如果将product\u sales['Expiration']=pd.to\u datetime(product\u sales['Expiration Date'])
分配回product\u sales['Expiration']),然后使用product\u sales['Expiration']
def days_between(date1, date2):
"""Calculates the number of days between two dates
Keyword arguments:
date1 -- The first date in the subtraction.
date2 -- The second date in the subtraction.
"""
return abs((date2 - date1).days)
product_sales['Expiration Date'] = pd.to_datetime(product_sales['Expiration Date'])
product_sales['Expiration Quartile'] = (product_sales['Expiration Date']
.apply(classify_expiration))
print (product_sales)
Category Brand Product Name Price Expiration Date Package ID Quantity \
0 Cat1 Brand1 Product1 $1000 2020-07-14 XXXXXX 34
Expiration Quartile
0 1
Pandas具有binnig的特殊功能,因此您可以使用以下功能:
product_sales['Expiration Date'] = pd.to_datetime(product_sales['Expiration Date'])
product_sales['Expiration Quartile'] = (product_sales['Expiration Date']
.apply(classify_expiration))
s = product_sales['Expiration Date'].sub(pd.to_datetime('today').floor('d')).dt.days
product_sales['Expiration Quartile1'] = pd.cut(s,
bins=[0, 30, 90,120, np.inf],
labels=[4,3,2,1])
print (product_sales)
Category Brand Product Name Price Expiration Date Package ID Quantity \
0 Cat1 Brand1 Product1 $1000 2020-07-14 XXXXXX 34
1 Cat1 Brand1 Product1 $1000 2020-01-13 XXXXXX 34
2 Cat1 Brand1 Product1 $1000 2019-11-01 XXXXXX 34
3 Cat1 Brand1 Product1 $1000 2020-01-15 XXXXXX 34
Expiration Quartile Expiration Quartile1
0 1 1
1 3 3
2 4 4
3 2 2