如何根据其他两列填充 nan 值?

时间:2021-03-31 18:14:28

标签: python pandas numpy

假设您有以下 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。

对不起,如果这有点不连贯,我已经工作太久了。 请帮忙!

1 个答案:

答案 0 :(得分:0)

以下是我对这项工作所做的假设。

  1. 仅当 taxrate#1 为 NULL 时才更新 taxrate#1 中的值。
  2. ExclVATVAT 中的所有值都将具有值。如果值为 NaN 或 0,则必须扩展条件以检查它们。
  3. 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 值修改 ExclVATtaxrate#Y 值。如果需要,我们可以进行计算并相应地调整美元。同样,需要更清楚地了解需要调整的内容。 VATExclVAT