假设我有一个看起来像这样的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
答案 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函数,即可找到需要应用的行。