THN*_*THN 3 python dataframe pandas
在某些情况下,即使不存在列标签,访问Pandas数据框也不会引发异常。
我应该如何检查这些情况,以避免读到错误的结果?
a = pd.DataFrame(np.zeros((5,2)), columns=['la', 'lb'])
a
Out[349]:
la lb
0 0.0 0.0
1 0.0 0.0
2 0.0 0.0
3 0.0 0.0
4 0.0 0.0
a.loc[:, 'lc'] # Raised exception as expected.
a.loc[:, ['la', 'lb', 'lc']] # Not expected.
Out[353]:
la lb lc
0 0.0 0.0 NaN
1 0.0 0.0 NaN
2 0.0 0.0 NaN
3 0.0 0.0 NaN
4 0.0 0.0 NaN
a.loc[:, ['la', 'wrong_lb', 'lc']] # Not expected.
Out[354]:
la wrong_lb lc
0 0.0 NaN NaN
1 0.0 NaN NaN
2 0.0 NaN NaN
3 0.0 NaN NaN
4 0.0 NaN NaN
Run Code Online (Sandbox Code Playgroud)
更新:有一个建议重复的问题(在数据帧基于标签安全的选择),但它是关于行选择,我的问题是关于列选择。
它看起来像是因为至少存在一列,所以它返回一个放大的df作为重新索引操作。
您可以定义一个用户函数来验证将处理该列是否存在的列。在这里,我从传入的iterable中构造一个pandas Index对象,并调用intersection
以从现有df中返回并传入iterable的公共值:
In [80]:
def val_cols(cols):
return pd.Index(cols).intersection(a.columns)
?
a.loc[:, val_cols(['la', 'lb', 'lc'])]
Out[80]:
la lb
0 0.0 0.0
1 0.0 0.0
2 0.0 0.0
3 0.0 0.0
4 0.0 0.0
Run Code Online (Sandbox Code Playgroud)
这也可以处理完全丢失的列:
In [81]:
a.loc[:, val_cols(['x', 'y'])]
Out[81]:
Empty DataFrame
Columns: []
Index: [0, 1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)
这也可以处理您的后一种情况:
In [83]:
a.loc[:, val_cols(['la', 'wrong_lb', 'lc'])]
Out[83]:
la
0 0.0
1 0.0
2 0.0
3 0.0
4 0.0
Run Code Online (Sandbox Code Playgroud)
更新
如果您只想测试所有内容是否有效,则可以遍历列表中的每一列并附加duff列:
In [93]:
def val_cols(cols):
duff=[]
for col in cols:
try:
a[col]
except KeyError:
duff.append(col)
return duff
invalid = val_cols(['la','x', 'y'])
print(invalid)
['x', 'y']
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
723 次 |
最近记录: |