如何根据其他列值动态填充列值?

时间:2021-04-18 09:41:22

标签: python pandas dataframe numpy

假设您有以下 df:

d = {'taxrate#1': [0.21, np.nan, np.nan], 'taxrate#2': [0.0, np.nan, np.nan]}
colstbf = pd.DataFrame(data=d)
colstbf

    taxrate#1   taxrate#2
0   0.21          0.0
3   NaN           NaN
5   NaN           NaN

另一个df:

d = {'btw-percentage#1': [0.21, 0.21, 0], 'btw-percentage#2': [0.06, np.nan, 0.21]}
colsfilling = pd.DataFrame(data=d)
colsfilling


btw-percentage#1    btw-percentage#2
0   0.21            0.06
1   0.21            NaN
2   0.00            0.21

当 df 中的值为 NaN 时,我想用另一个 df 的其他值填充 df。

但是,由于税率项目可能很大(10 或更大,具体取决于文档),我想动态执行此操作。

所以我尝试了以下方法:

cols_to_check = []
cols_to_check = colstbf.filter(regex = 'taxrate').columns
colstbf['is_na'] = colstbf[cols_to_check].isnull().apply(lambda x: all(x), axis=1)

colstbf = np.where(df['is_na'] == True, colstbf, df['taxrate#1'])

与:

colsfinal = colstbf.fillna(colsfilling)

但是,上面的方法不起作用..

期望输出:

    taxrate#1   taxrate#2
0   0.21          0.0
3   0.21          NaN
5   0.00          0.21


colstbf = df.filter(like='taxrate')
colsfilling = dfresult.filter(like='btw-percent').astype(float)
colsfilling = colsfilling/100
colsfilling.columns = colstbf.columns
colstbf.combine_first(colsfilling)
df = df.join(colstbf, lsuffix='_left')
df = df[df.columns.drop(list(df.filter(regex='_left')))]
df

请帮忙!

2 个答案:

答案 0 :(得分:2)

您也可以通过设置 overwrite 参数来使用 pandas.DataFrame.update()

overwrite bool, default True 如何处理重叠键的非 NA 值:

  • True:用其他值覆盖原始 DataFrame 的值。
  • False:仅更新原始 DataFrame 中不适用的值。
colstbf.update(colsfilling.rename(columns=dict(zip(colsfilling.columns, colstbf.columns))), overwrite=False)
print(colstbf)

   taxrate#1  taxrate#2
0       0.21       0.00
1       0.21        NaN
2       0.00       0.21

答案 1 :(得分:1)

您可以在此处使用 df.combine_first

colsfilling.columns = colstbf.columns
colstbf.combine_first(colsfilling)

  taxrate#1  taxrate#2
0       0.21       0.00
1       0.21        NaN
2       0.00       0.21