我有一个包含付款数据的数据框。我想检查付款日期是否早于2018年9月30日,如果余额等于费用金额,然后将余额设置为0.我试图核销任何早于2018年9月30日的余额。付款=余额。
如果余额和费用相等,则下面的代码似乎将一切都设为零。
class ModelViewSet(viewsets.ModelViewSet):
permission_classes = (
DefaultPermission,
CustomPermission,
)
输入
def MandT(df):
if datetime.date(df['PaymentDate']) < datetime.date(2018, 9, 30):
return 0 if df['Balance'] == df['Charge Amount'] else df['Balance']
df['Balance1'] = df.apply(MandT, axis=1)
预期输出
Date Svc_From_Amount Charge_Balance1
8/1/2017 326.00 326.00
8/1/2017 82.00 100.00
8/1/2017 82.00 200.00
10/2/2018 -156.00 -156.00
12/1/2018 82.00 82.00
8/1/2017 82.00 -5.00
8/1/2017 82.00 8.00
答案 0 :(得分:0)
您可以使用.loc
来设置值。我假设Balance1
是您要添加的新列
#pop selected row of the balance 1 to 0
df.loc[(df['PaymentDate']) < datetime.date(2018, 9, 30)) & (df['Balance'] == df['Charge Amount']), 'Balance1'] = 0
#pop NaN row of the balance 1 to balance
df.loc[np.isnan(df['Balance1']), 'Balance1'] = df[np.isnan(df['Balance1'])]['Balance']
答案 1 :(得分:0)
我认为问题可能出在
if datetime.date(df['PaymentDate']) < datetime.date(2018, 9, 30):
由于您没有提供有关数据框的更多信息,我假设您的“付款日期”列中包含字符串格式的日期。如果我是对的,您可以尝试通过以下方式替换上面的代码:
if datetime.datetime.strptime(df['PaymentDate'], "%m/%d/%Y") < datetime.datetime(2018, 9, 30):
此代码会将您的日期转换为日期时间格式,以便进行比较。
答案 2 :(得分:0)
尝试一下是否可行。 您将必须在下面的代码中的所有位置适当地重命名这些列(如您的日期一样)。
df['Date']= pd.to_datetime(df['Date'],format='%m/%d/%Y')
def MandT(x):
if ((x['Date']) < datetime.date(2018, 9, 30)) & (x['Charge_Balance1'] == x['Svc_From_Amount']):
return 0
else:
return x['Charge_Balance1']
df['Charge_Balance1'] = df.apply(MandT, axis=1)