如果pandas dataframe.loc位置不存在则返回默认值
我发现自己经常需要检查一个数据表(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]'
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