我有一个名为df的数据框,其中有两列看起来像这样:
Column1 Column2
430 550
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
NaN NaN
453 559
460 650
我想创建另一个名为第3列的列,该列包含结果column2 - column1。我尝试创建一个函数,然后使用pandas中的apply函数将我的函数应用于数据框df中的每一行。为此,我创建了以下代码:
def range(row):
return (row['column2'])-(row['column1'])
df['column3'] = df.apply(range, axis=1)
df #Calling the data frame to view it
但是我的代码给了我以下错误:
TypeError Traceback (most recent call last)
<ipython-input-13-604781044dd4> in <module>()
6
7 #Creating column called column3 by using the apply function in pandas to apply the function to each row
----> 8 df['column3'] = df.apply(range, axis=1)
9 #Setting axis=1 specifier, that means that the application will be done at a row, rather than at column level.
10 df #Calling the data frame to view it
C:\Users\v761473\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, args, **kwds)
4358 f, axis,
4359 reduce=reduce,
-> 4360 ignore_failures=ignore_failures)
4361 else:
4362 return self._apply_broadcast(f, axis)
C:\Users\v761473\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\frame.py in _apply_standard(self, func, axis, ignore_failures, reduce)
4454 try:
4455 for i, v in enumerate(series_gen):
-> 4456 results[i] = func(v)
4457 keys.append(v.name)
4458 except Exception as e:
<ipython-input-13-604781044dd4> in range(row)
2 def range(row):
3 """ Function to calculate the range from """
----> 4 return (row['column2'])-(row['column1'])
5
6
TypeError: ("unsupported operand type(s) for -: 'str' and 'str'", 'occurred at index 0')
由于错误显示为TypeError: ("unsupported operand type(s) for -: 'str' and 'str'", 'occurred at index 0')
我决定使用df.dtypes
验证我的列类型,两列如下:
column1 object
column2 object
我的错误可能会发生,因为我需要将列转换为int类型吗?任何有关可能导致错误以及如何解决错误的见解都将非常感激。如果需要,我使用以下代码读取了我的数据框:
df = pd.read_csv('quartiles.csv',skipinitialspace = True)
再次,任何建议都将非常感谢!
答案 0 :(得分:2)
问题,基于您显示的错误消息,您的数据框中的某处隐藏了一些字符串。因此需要在使用数据之前将其删除。要查看哪些列:
print(df.dtypes)
如果您看到任何列的object
,您就会知道它是隐藏字符串的位置。尝试找到它可能无法正确转换的原因可能会很好。要将所有列转换为正确的格式:
cols = df.columns
df[cols] = df[cols].apply(pd.to_numeric, errors='coerce', axis=1)
在此之后,您可以像现在一样执行操作,或者使其更易于阅读:
df['column3'] = df[column2] - df[column1]
如下所示,转换数据格式的一种更有效的替代方法是在csv中读取时定义数据类型:
import numpy as np
df = pd.read_csv("data.csv", dtype=np.float64)
对于dtype,您还可以使用定义每列类型的字典(如果它们需要不同)。如果在读取csv时出错,则可能需要将参数error_bad_lines设置为False。但是,如果你仍然遇到问题,你可能不得不坚持原样阅读,然后转换数据格式。