我试图使用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)
,这也可以打印正确的响应。任何想法为什么会发生这种情况?抱歉,这很简单。
答案 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'
,则可能会失败)