需要帮助使用python pandas模块从减去其他两列创建一列

时间:2017-10-31 15:16:56

标签: python python-3.x

我有一个名为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)

再次,任何建议都将非常感谢!

1 个答案:

答案 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。但是,如果你仍然遇到问题,你可能不得不坚持原样阅读,然后转换数据格式。