【问题标题】:Python error cannot do a non empty take from an empty axesPython 错误不能从空轴中执行非空操作
【发布时间】:2017-12-21 16:14:45
【问题描述】:

我有一个超过 40 万行的 pandas 数据框,现在我想计算每一行的四分位距,但我的代码产生了以下错误:

不能从一个空的轴上做一个非空的取值

我的代码:

def calIQR(x):
    x=x.dropna()
    return (np.percentile(x,75),np.percentile(x,25))

df["count"]=df.iloc[:,2:64].apply(calIQR,axis=1)

我正在运行 Python 2.7.13

我在网上搜索过,但仍然不知道为什么会出现这个错误。

2 到 64 列的数据集基本上是这样的:

在每一行中,都有一些 NaN 值,但我确信没有行将全部为 NaN。

【问题讨论】:

  • 如果您在问题中使用了诸如 pandas 或 numpy 之类的库,您可能应该提及它们。
  • 还提供了一个较小的“虚拟”DataFramse,它也表现出这种行为,因此我们可以进行测试
  • 您是否检查了哪个列引发了该错误,x 的内容是什么?
  • 谢谢!我检查了有问题的行。由于某些原因,其中的值都变成了 NaN。

标签: python python-2.7 pandas


【解决方案1】:

我认为这里的问题行在263 列中包含所有NaNs 值,x = x.dropna 返回空Series

所以需要在iloc之后添加dropna

np.random.seed(100)
df = pd.DataFrame(np.random.random((5,5)))
df.loc[3, [3,4]] = np.nan
df.loc[2] = np.nan
print (df)
         0         1         2         3         4
0  0.543405  0.278369  0.424518  0.844776  0.004719
1  0.121569  0.670749  0.825853  0.136707  0.575093
2       NaN       NaN       NaN       NaN       NaN
3  0.978624  0.811683  0.171941       NaN       NaN
4  0.431704  0.940030  0.817649  0.336112  0.175410

def calIQR(x):
    x = x.dropna()
    return (np.percentile(x,75),np.percentile(x,25))

df["count"]=df.iloc[:,2:4].dropna(how='all').apply(calIQR,axis=1)
print (df)
          0         1         2         3         4  \
0  0.543405  0.278369  0.424518  0.844776  0.004719   
1  0.121569  0.670749  0.825853  0.136707  0.575093   
2       NaN       NaN       NaN       NaN       NaN   
3  0.978624  0.811683  0.171941       NaN       NaN   
4  0.431704  0.940030  0.817649  0.336112  0.175410   

                              count  
0  (0.739711496927, 0.529582226142)  
1    (0.65356621375, 0.30899313104)  
2                               NaN  
3  (0.171941012733, 0.171941012733)  
4  (0.697265021613, 0.456496307285)  

或者使用Series.quantile:

 def calIQR(x):
    return (x.quantile(.75),x.quantile(.25))

#with real data change 2;4 to 2:64
df["count"]=df.iloc[:,2:4].apply(calIQR,axis=1)
print (df)
          0         1         2         3         4  \
0  0.543405  0.278369  0.424518  0.844776  0.004719   
1  0.121569  0.670749  0.825853  0.136707  0.575093   
2       NaN       NaN       NaN       NaN       NaN   
3  0.978624  0.811683  0.171941       NaN       NaN   
4  0.431704  0.940030  0.817649  0.336112  0.175410   

                                       count  
0   (0.7397114969272109, 0.5295822261418257)  
1    (0.653566213750024, 0.3089931310399766)  
2                                 (nan, nan)  
3   (0.1719410127325942, 0.1719410127325942)  
4  (0.6972650216127702, 0.45649630728485585)  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-01-27
    • 2021-09-20
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2015-08-01
    相关资源
    最近更新 更多