无法使用简单的条件语句修改DataFrame。但是在使用静态数字时有效

时间:2018-12-21 22:10:09

标签: python pandas numpy

我试图使用iterrows()函数更改熊猫DataFrame对象的系列。 DataFrame充满了随机浮点数。以下是这两段代码的示例:

此作品有效:

for index,row in other_copy.iterrows()
    other_copy.loc[index] = (other_copy.loc[index] > 30)

但这不是:

for index,row in other_copy.iterrows():
   top_3 = other_copy.loc[index].nlargest(3)
   minimum = min(top_3)
   other_copy.loc[index] = (other_copy.loc[index] > minimum)

第一个会相应地修改DataFrame的True和False。但是,第二个错误给了我以下错误:

> TypeError                                 Traceback (most recent call last) <ipython-input-116-11f6c908f54a> in <module>()
      1 for index,row in other_copy.iterrows():
----> 2     top_3 = other_copy.loc[index].nlargest(3)
      3     minimum = min(top_3)
      4     other_copy.loc[index] = (other_copy.loc[index] > minimum)

/opt/conda/lib/python3.6/site-packages/pandas/core/series.py in
nlargest(self, n, keep)    2061         dtype: float64    2062        
"""
-> 2063         return algorithms.SelectNSeries(self, n=n, keep=keep).nlargest()    2064     2065     def nsmallest(self, n=5,
keep='first'):

/opt/conda/lib/python3.6/site-packages/pandas/core/algorithms.py in
nlargest(self)
    915 
    916     def nlargest(self):
--> 917         return self.compute('nlargest')
    918 
    919     def nsmallest(self):

/opt/conda/lib/python3.6/site-packages/pandas/core/algorithms.py in
compute(self, method)
    952             raise TypeError("Cannot use method '{method}' with "
    953                             "dtype {dtype}".format(method=method,
--> 954                                                    dtype=dtype))
    955 
    956         if n <= 0:

TypeError: Cannot use method 'nlargest' with dtype object

我在这里错过了一些简单的东西吗?最小变量只是一个浮点数,应该进行比较。我什至尝试使用

int(minimum)

但是它仍然给我同样的错误。我也可以使用:

print(other_copy.loc[index] > minimum)

,这也可以打印正确的响应。任何想法为什么会发生这种情况?抱歉,这很简单。

1 个答案:

答案 0 :(得分:1)

问题不是minimum,而是设置minimum的代码。当您对行进行切片时,它会变成一个具有dtype object的系列(因为在您的列中存在混合的dtype,因此object dtype是唯一与所有这些兼容的dtype)

当您尝试在此行切片上运行.nlargest()时,它显然会告诉您问题所在:TypeError: Cannot use method 'nlargest' with dtype object因此,应将序列转换为数字。

import pandas as pd

for index,row in other_copy.iterrows():
   top_3 = pd.to_numeric(other_copy.loc[index], errors = 'coerce').nlargest(3)
   minimum = min(top_3)
   other_copy.loc[index] = (other_copy.loc[index] > minimum)

如果该行中没有可转换为数字的条目,则可能会导致另一个错误,并且如果您尝试进行不安全的比较(例如'str'> 'float',则可能会失败)