gpt4 book ai didi

python - 如何迭代 Pandas.DataFrame 中的列并将函数的结果附加到同一行?

转载 作者:行者123 更新时间:2023-12-01 07:07:15 27 4
gpt4 key购买 nike

我有一个Pandas.DataFrame通过以下 CSV 生成:

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 个月之间,等等)。

我的问题是,当尝试转换 Expiration Date 时列到日期时间(使用 pandas.to_datetime(df['Expiration Date']) ),然后应用我的 classify_expiration()函数时,类型要么与函数指示的内容不匹配,要么尝试将该函数应用于 index 0我认为这是标题(因此与 %m/%d/%Y 格式不匹配)。我尝试在分类函数内以及 .apply() 之前将列转换为日期时间称呼。我也尝试过使用 timedelta将到期日期与今天的当前日期进行比较,但它不适用于 datetime.date.today() .

这是我尝试的第一种方法:

def classify_expiration(row):    
one_week = timedelta(weeks=1, days=0, hours=0, minutes=0, seconds=0)

if ((one_week * 0) <= (date.today() - row['Expiration Date']) <= (one_week * 4)):
return 4

这种方式给我带来了与类型不正确相关的错误 index 0或者无法将该功能应用于系列。

这是我刚刚尝试过的,它给了我 AssertionError :

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.
"""
date1 = datetime.strptime(date1, '%m/%d/%Y')
date2 = datetime.strptime(date2, '%m/%d/%Y')
return abs((date2 - date1).days)


def classify_expiration(row):
"""Calculate days/weeks to expiration. Assign quartile based on value.

Keyword arguments:
row -- row in a `pandas.core.frame.DataFrame` object. e.g. `df['A']`
"""

date_today = datetime.strptime(
date.today().strftime('%m/%d/%Y'), '%m/%d/%Y')

if (days_between(row, date_today) <= 30):
return 4
if (31 <= days_between(row, date_today) <= 90):
return 3
if (91 <= days_between(row, date_today) <= 120):
return 2
if (days_between(row, date_today) >= 121):
return 1

这是我尝试应用该函数的地方:

# Convert column to `datetime` if its current type is str
pd.to_datetime(product_sales['Expiration Date'])

# Applying the `classify_expiration()` function
product_sales['Expiration Quartile'] = product_sales.apply(
lambda row: classify_expiration(row), axis=1
)

我希望该函数向 DataFrame 追加一个新列,其中包含每行中生成的到期日期四分位数。我会收到范围从 AssertionError 的错误, argument 1 must be str, not Series ,以及与 index 0 相关的各种其他错误.

最佳答案

如果分配回 product_sales['Expiration Date'] = pd.to_datetime(product_sales['Expiration Date']) 且然后使用 product_sales['Expiration Date'].apply(classify_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 有特殊的函数,所以你的函数可以使用 cut :

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

关于python - 如何迭代 Pandas.DataFrame 中的列并将函数的结果附加到同一行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58387380/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com