【问题标题】:pandas dataframe - return the value in iloc, or return zero if it does not existpandas dataframe - 返回 iloc 中的值,如果不存在则返回零
【发布时间】:2019-01-23 19:53:01
【问题描述】:

在对 Pandas 数据框使用 iloc 方法时,如果该值不存在,我想返回零:(我有一个查询,它将始终返回一行或一个空数据框。我想要第一个左值存在)

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 方法的东西!

【问题讨论】:

  • 将 .fillna(0) 链接到查询或数据框的末尾,这将为您处理 nas。
  • 为什么不使用fillna 将缺失值替换为0?
  • fillna(0) 永远不会工作,这是关于当query 是一个空数据框时会发生的情况。使用0 在空数据框中填充 null 不会产生任何影响。

标签: python pandas indexing


【解决方案1】:

你可以更 Pythonic 替换你的 try/except 块:

print(0 if len(query)==0 else query.iloc[0][0])

说明:len() 应用于 pandas Dataframe 返回行数。

更新:正如 cmets 中所建议的,query.empty 这更惯用,.iat 更适合标量查找,因此:

print(0 if query.empty else query.iat[0,0])

【讨论】:

  • 不错!这就是我想要的!一个简单的len 在这里会有所帮助!结合我建议的两个答案!:print(query.iat[0,0] if len(query)!=0 else 0)
  • 更惯用的是使用if not query.empty而不是if len(query) == 0
【解决方案2】:

你可以使用类似的东西

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

【讨论】:

  • 解决这个问题的非常聪明和简洁的方法。谢谢
【解决方案3】:

没有比try / except 更好的方法了。 iloc 的基本原理是按 integer 位置位置进行索引。

行为和功能与 NumPy np.ndarray、Python list 和其他可索引对象一致。没有直接的方法来索引列表的第一个值如果列表为空则返回0

稍微好一点的方法是显式地只捕获IndexError 并使用iat 通过整数位置访问标量。此外,您可以同时按行和列进行索引

try:
    print(query.iat[0, 0])
except IndexError:
    print(0)

【讨论】:

    猜你喜欢
    • 2019-02-15
    • 1970-01-01
    • 2015-07-11
    • 2018-04-10
    • 2014-06-17
    • 1970-01-01
    • 1970-01-01
    • 2016-05-30
    • 1970-01-01
    相关资源
    最近更新 更多