如果pandas dataframe.loc位置不存在则返回默认值

58 投票
4 回答
41089 浏览
提问于 2025-04-18 04:58

我发现自己经常需要检查一个数据表(dataframe)中某一列或某一行是否存在,然后再去引用它。比如,我最后写了很多这样的代码:

if 'mycol' in df.columns and 'myindex' in df.index: x = df.loc[myindex, mycol]
else: x = mydefault

有没有什么更简单的方法来做到这一点呢?比如在一个任意的对象上,我可以用 x = getattr(anobject, 'id', default) 这样的方式来获取属性。那在pandas中有没有类似的做法呢?有没有什么更优雅的方法来实现我想做的事情?

4 个回答

0

使用 reindex

df.reindex(index=['row1', 'row2'], columns=['col1', 'col2'], fill_value=mydefault)

这里的好处在于可以用列表来指定行和列,有些行和列可能存在,有些则可能不存在。如果某一行或某一列缺失,你会得到一个备用值。

举个例子:

In[1]:
df = pd.DataFrame({ 
 'A':[1, 2, 3],
 'B':[5, 3, 7],
})
df

Out[1]:
    A   B
0   1   5
1   2   3
2   3   7

In[2]:
df.reindex(index=[0, 1, 100], columns=['A', 'C'], fill_value='FV')

Out[2]:
    A   C
0   1   FV
1   2   FV
100 FV  FV
1

DataFrame 中,有一个叫 get 的方法可以用来获取某一列的数据;而在 Series 中,也有一个 get 方法可以用来获取某个具体的项。所以你可以把这两个方法连在一起使用,来获取一个单独的值:

   A  B
0  0  2
1  1  3

df.get('B', default=pd.Series()).get(1, default='[unknown]')

输出结果:

3

如果你要找的索引或列不存在:

df.get('B', default=pd.Series()).get(2, default='[unknown]')
# or
df.get('C', default=pd.Series()).get(1, default='[unknown]')

输出结果:

'[unknown]'
27

Python有一种“先犯错再说”的思维方式。你会发现很多关于这个话题的帖子,比如这一篇

在Python中,捕捉错误的成本相对较低,所以鼓励大家多用这种方式。这种方法被称为EAFP

举个例子:

try:
    x = df.loc['myindex', 'mycol']
except KeyError:
    x = mydefault
61

这里有一个方法可以用在Series上:

所以你可以这样做:

df.mycol.get(myIndex, NaN)

举个例子:

In [117]:

df = pd.DataFrame({'mycol':arange(5), 'dummy':arange(5)})
df
Out[117]:
   dummy  mycol
0      0      0
1      1      1
2      2      2
3      3      3
4      4      4

[5 rows x 2 columns]
In [118]:

print(df.mycol.get(2, NaN))
print(df.mycol.get(5, NaN))
2
nan

撰写回答