根据其他列上的条件填充空值

时间:2020-04-16 09:16:31

标签: python pandas dataframe data-cleaning

我想根据第二列的值填充第一列的Null值。 (例如)

  1. 对于col2中的“ Apples”,col1中Nan的值应为12
  2. 对于“蔬菜”,col2中的值应为134,而不是col1中的Nan。

对于每个描述,在第一列中都有一个特定的代码(数字)。我需要以某种方式进行映射。

(忽略。(点)

我所能想到的就是制作一个代码字典并替换null,但是那是非常硬的。

有人可以帮忙吗?

col1. col2

12.     Apple

134.    Vegies

23.     Oranges

Nan.    Apples

Nan.    Vegies

324.    Sugar

Nan.    Apples

1 个答案:

答案 0 :(得分:0)

**重新更新

在这里,我复制您的DF和实现:

import pandas as pd
import numpy as np
l1 = [12, 134, 23, np.nan, np.nan, 324, np.nan,np.nan,np.nan,np.nan]
l2 = ["Apple","Vegies","Oranges","Apples","Vegies","Sugar","Apples","Melon","Melon","Grapes"]
df = pd.DataFrame(l1, columns=["col1"])
df["col2"] = pd.DataFrame(l2)

df
Out[26]: 
    col1     col2
0   12.0    Apple
1  134.0   Vegies
2   23.0  Oranges
3    NaN   Apples
4    NaN   Vegies
5  324.0    Sugar
6    NaN   Apples
7    NaN    Melon
8    NaN    Melon
9    NaN   Grapes

然后根据您的规则替换Null值:

df.loc[df.col2 == "Vegies", 'col1'] = 134
df.loc[df.col2 == "Apple", 'col1'] = 12

如果您想将它们应用于更大的比例,请考虑首先制作一个字典: 例如:

item_dict = {"Apples":12, "Melon":65, "Vegies":134, "Grapes":78}

然后使用此自定义函数将所有这些应用于您的数据框:

 def item_mapping(df, dictionary, colsource, coltarget):
    dict_keys = list(dictionary.keys())
    dict_values = list(dictionary.values())
    for x in range(len(dict_keys)):
        df.loc[df[colsource]==dict_keys[x], coltarget] = dict_values[x]
    return(df)

用法示例:

item_mapping(df, item_dict, "col2", "col1")
    col1     col2
0   12.0    Apple
1  134.0   Vegies
2   23.0  Oranges
3   12.0   Apples
4  134.0   Vegies
5  324.0    Sugar
6   12.0   Apples
7   65.0    Melon
8   65.0    Melon
9   78.0   Grapes