使用函数逐行更新缺少数据的单元格值

时间:2019-05-31 06:11:09

标签: python pandas dataframe iteration

假设我有一个看起来像这样的DataFrame:

In [1]: df = pd.DataFrame([['name1', 2, 3, 'red'], ['name2', 4, 5, 'orange'], ['name3', 6, 7, '-'], ['name4', 8, 9, '-']], \
              columns=('names', 'data1', 'data2', 'category'))
        df

Out[1]:
     name   data1   data2   category
0   name1       2       3        red
1   name2       4       5     orange
2   name3       6       7          -
3   name4       8       9          -

对于某些行,某些列中的数据丢失,用'-'表示:

我要做的是逐行填写丢失的数据。有一个函数可以为每行标识正确的类别(如果已将名称传递给该行)。由于实际功能是从数据库中提取数据,因此我使用了任意术语来使问题更笼统。例如:

In [2]: import library as lib
        lib.get_category('name1')

Out[2]: ['red']

如何使用函数逐行更新所有缺少的值?我尝试使用df.loc来获取所有缺少数据的行,并将一系列相应的名称传递给该函数,但是它只会使用该系列中的最后一个值来更新所有缺少的值。我相信这里的核心问题是正确迭代。

最终的预期输出应如下所示(假设lib.get_category('name3')返回['yellow'],而lib.get_category('name4')返回['green']:

Out[1]:
     name   data1   data2   category
0   name1       2       3        red
1   name2       4       5      orange
2   name3       6       7      yellow
3   name4       8       9       green

2 个答案:

答案 0 :(得分:0)

使用可以为此使用Series.apply

import library as lib
def func(name):
    return lib.get_category('name1')

df['category'] = df['name'].apply(func)

apply函数func将从名称列中获取值,并为对应的行返回一个值。因此,请相应地编辑功能。

还要注意,以上代码将替换该列的现有类别值。但正如您提到的那样,类别可以从名称派生,那么这应该不是问题。

答案 1 :(得分:0)

尝试一下:

*

只需在loc中使用apply函数,即可找到需要应用的行。