在使用iloc方法处理Pandas数据框时,如果值不存在,我想返回零:(我有一个查询,它总是返回一行或一个空的数据框。当我想返回第一个左值时存在)
import pandas as pd
mydict = {"col1":[1,2], "price":[1000,2000]}
df = pd.DataFrame(mydict)
query=df[df['price']>3000]
try:
print(query.iloc[0][0])
except BaseException:
print(0)
#print result: 0
iloc是否有更好的方法或内置方法?我正在考虑类似于Python字典的get
方法!
答案 0 :(得分:0)
从本质上讲,没有什么比try
/ except
更好的了。 iloc
的基本原理是按整数位置索引。
该行为和功能与NumPy np.ndarray
,Python list
和其他可索引对象一致。没有直接方法对列表的第一个值编制索引 或如果列表为空,则返回0
。
一种更好的方法是显式并仅捕获IndexError
并使用iat
通过整数位置访问标量。此外,您可以按行和列同时编入索引:
try:
print(query.iat[0, 0])
except IndexError:
print(0)
答案 1 :(得分:0)
您可以使用以下命令将try / except块替换为pythonic
print(0 if len(query)==0 else query.iloc[0][0])
说明:应用于熊猫数据框的len()返回行数。
更新:如评论中所建议,query.empty
更为惯用,而.iat
更适合标量查找,因此:
print(0 if query.empty else query.iat[0,0])
答案 2 :(得分:0)
你可能可以使用类似的东西
next(iter(series, default))
例如,使用您的输入
In [1]:
import pandas as pd
mydict = {"col1":[1,2], "price":[1000,2000]}
df = pd.DataFrame(mydict)
df
Out[1]:
col1 price
0 1 1000
1 2 2000
并过滤价格 > 2000,给出默认值(我们将其设置为零),因为 df.loc[mask] 将为空
In [2]:
mask = (df['price']>2000)
next(iter(df.loc[mask]['col1']), 0)
Out[2]:
0
其他情况按预期工作。例如,过滤价格 > 1500,给出 2
In [3]:
mask = (df['price']>1500)
next(iter(df.loc[mask]['col1']), 0)
Out[3]:
2
对价格进行过滤 > 500 给出 1
In [4]:
mask = (df['price']>500)
next(iter(df.loc[mask]['col1']), 0)
Out[4]:
1