假设您有以下 df:
VAT taxrate#1 taxrate#2 taxrate#3 taxrate#4 ExclVAT
-- ------- ----------- ----------- ----------- ----------- ---------
0 19.95 21 nan nan nan 95
2 0 0 0 0 nan nan
6 3.15 nan 21 nan nan 15
9 125.34 21 nan nan nan 596.86
11 540.69 21 nan nan nan 2574.73
13 254.31 21 nan nan nan 1211
15 1378.94 nan nan nan nan 6566.36
18 401.65 nan nan nan nan 1912.6
20 58.84 nan nan nan nan 264.18
22 17.85 21 nan nan nan 85
24 16.38 21 21 21 nan 77.98
28 252 21 21 nan nan 1200
31 6.24 21 nan nan nan 29.73
33 60.9 21 21 nan nan 290
36 60.9 21 21 nan nan 290
39 75.6 21 21 nan nan 360
如果所有税率值为 NaN,我需要计算增值税金额的代码。
增值税可以计算并插入到税率 #1 中。增值税可以是 21%、9% 或 0%。
如何实现这一目标?
所需的输出:
VAT taxrate#1 taxrate#2 taxrate#3 taxrate#4 ExclVAT
-- ------- ----------- ----------- ----------- ----------- ---------
0 19.95 21 nan nan nan 95
2 0 0 0 0 nan nan
6 3.15 nan 21 nan nan 15
9 125.34 21 nan nan nan 596.86
11 540.69 21 nan nan nan 2574.73
13 254.31 21 nan nan nan 1211
15 1378.94 21 nan nan nan 6566.36
18 401.65 21 nan nan nan 1912.6
20 58.84 nan nan nan nan 264.18
22 17.85 21 nan nan nan 85
24 16.38 21 21 21 nan 77.98
28 252 21 21 nan nan 1200
31 6.24 21 nan nan nan 29.73
33 60.9 21 21 nan nan 290
36 60.9 21 21 nan nan 290
39 75.6 21 21 nan nan 360
我尝试了以下代码:
cols_to_check = ['taxrate#1', 'taxrate#2','taxrate#3']
dftaxitems['is_na'] = dftaxitems[cols_to_check].isnull().apply(lambda x: all(x), axis=1)
dftaxitems
for i, row in dftaxitems.iterrows():
if dftaxitems['is_na'][i] == True:
dftaxitems['taxrate#1'] = dftaxitems['taxrate#1'].fillna((dftaxitems['BTW'].astype(float) / dftaxitems['ExclBTW'].astype(float)) * 100)
def custom_round(x, base=3):
return int(base * round(float(x)/base))
dftaxitems['taxrate#1'] = dftaxitems['taxrate#1'].apply(lambda x: custom_round(x, base=3))
dftaxitems
然而,这将导致不四舍五入到 21、9 或 0 或 np.nan。
我希望计算出的数量恰好为 21,9 或 0,否则为 np.nan。
现在代码将四舍五入到最接近的 3 表,查看值与 21,9 或 0 的接近程度。
我的问题是: 将增值税除以 ExclVAT 计算增值税百分比并将其添加到税率 #1 时,如何将 21%、9% 或 0% 分配给税率 #1。
对不起,如果这有点不连贯,我已经工作太久了。 请帮忙!
答案 0 :(得分:0)
以下是我对这项工作所做的假设。
taxrate#1
为 NULL 时才更新 taxrate#1
中的值。ExclVAT
和 VAT
中的所有值都将具有值。如果值为 NaN
或 0,则必须扩展条件以检查它们。VAT/ExclVAT
将为 taxrate#1
提供 %。无需进行额外的计算调整。如果我们同意这些假设,那么您可以使用:
df['taxrate#1'] = df.apply(lambda x: round((x['VAT'] / x['ExclVAT']),2)*100 if pd.isnull(x['taxrate#1']) else x['taxrate#1'], axis=1).astype(int)
一旦我对方法有了更清晰的了解,并且如果您希望修改增值税值或 ExclVAT 值,则可以更改代码以解决它。
这样的输出将是(PS:我保留了 ID 列以供参考):
id VAT taxrate#1 taxrate#2 taxrate#3 taxrate#4 ExclVAT
0 0 19.95 21 NaN NaN NaN 95.00
1 2 0.00 0 0.0 0.0 NaN NaN
2 6 3.15 21 21.0 NaN NaN 15.00
3 9 125.34 21 NaN NaN NaN 596.86
4 11 540.69 21 NaN NaN NaN 2574.73
5 13 254.31 21 NaN NaN NaN 1211.00
6 15 1378.94 21 NaN NaN NaN 6566.36
7 18 401.65 21 NaN NaN NaN 1912.60
8 20 58.84 22 NaN NaN NaN 264.18
9 22 17.85 21 NaN NaN NaN 85.00
10 24 16.38 21 21.0 21.0 NaN 77.98
11 28 252.00 21 21.0 NaN NaN 1200.00
12 31 6.24 21 NaN NaN NaN 29.73
13 33 60.90 21 21.0 NaN NaN 290.00
14 36 60.90 21 21.0 NaN NaN 290.00
15 39 75.60 21 21.0 NaN NaN 360.00
如果您想强制征收增值税,您可以决定执行以下操作:
df['taxrate#Y'] = df.apply(lambda x: round((x['VAT'] / x['ExclVAT']),2)*100 if not (pd.isnull(x['ExclVAT']) or pd.isnull(x['VAT'])) else 0, axis=1).astype(int)
df.loc[df['taxrate#Y'] > 15, 'taxrate#Y'] = 21
df.loc[(df['taxrate#Y'] > 0) & (df['taxrate#Y'] <= 15), 'taxrate#Y'] = 9
这与我发布的早期解决方案相比。我创建了一个新列 taxrate#X
。代码相同,但我将其分配给新列,而不是将其写回 taxrate#1
。
df['taxrate#X'] = df.apply(lambda x: round((x['VAT'] / x['ExclVAT']),2)*100 if pd.isnull(x['taxrate#1']) else x['taxrate#1'], axis=1).astype(int)
输出结果为:
id VAT taxrate#1 taxrate#2 ... taxrate#4 ExclVAT taxrate#X taxrate#Y
0 0 19.95 21.0 NaN ... NaN 95.00 21 21
1 2 0.00 0.0 0.0 ... NaN NaN 0 0
2 6 3.15 NaN 21.0 ... NaN 15.00 21 21
3 9 125.34 21.0 NaN ... NaN 596.86 21 21
4 11 540.69 21.0 NaN ... NaN 2574.73 21 21
5 13 254.31 21.0 NaN ... NaN 1211.00 21 21
6 15 1378.94 NaN NaN ... NaN 6566.36 21 21
7 18 401.65 NaN NaN ... NaN 1912.60 21 21
8 20 58.84 NaN NaN ... NaN 264.18 22 21
9 22 17.85 21.0 NaN ... NaN 85.00 21 21
10 24 16.38 21.0 21.0 ... NaN 77.98 21 21
11 28 252.00 21.0 21.0 ... NaN 1200.00 21 21
12 31 6.24 21.0 NaN ... NaN 29.73 21 21
13 33 60.90 21.0 21.0 ... NaN 290.00 21 21
14 36 60.90 21.0 21.0 ... NaN 290.00 21 21
15 39 75.60 21.0 21.0 ... NaN 360.00 21 21
请注意,我没有根据 VAT
值修改 ExclVAT
或 taxrate#Y
值。如果需要,我们可以进行计算并相应地调整美元。同样,需要更清楚地了解需要调整的内容。 VAT
或 ExclVAT
。