Pandas错误匹配字符串

时间:2017-07-08 17:04:07

标签: python string pandas

我的数据类似于下面的SampleDf数据。我正在尝试检查数据框中一列中的值以查看它们是否包含“sum”或“count”或“Avg”,然后创建一个值为“sum”,“count”或“Avg”的新列。当我在我的真实数据帧上运行下面的代码时,我收到以下错误。当我在我的真实数据帧上运行dtypes时,它表示所有列都是对象。以下代码与以下帖子有关。不幸的是,当我在我提供的SampleDf上运行代码时,我没有得到相同的错误,但我无法发布我的整个数据帧。

交的: Pandas and apply function to match a string

Code:

SampleDf=pd.DataFrame([['tom',"Avg(case when Value1 in ('Value2') and [DateType] in ('Value3') then LOS end)"],['bob',"isnull(Avg(case when XferToValue2 in (1) and DateType in ('Value3') and  [Value1] in ('HM') then  LOS end),0)"]],columns=['ReportField','OtherField'])


search1='Sum'
search2='Count'
search3='Avg'


def Agg_type(x):
    if search1 in x:
        return 'sum'
    elif search2 in x:
        return 'count'
    elif search3 in x:
        return 'Avg'
    else:
        return 'Other'

SampleDf['AggType'] = SampleDf['OtherField'].apply(Agg_type)

SampleDf.head()


Error:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-17-a2b4920246a7> in <module>()
     17         return 'Other'
     18 
---> 19 SampleDf['AggType'] = SampleDf['OtherField'].apply(Agg_type)
     20 
     21 #SampleDf.head()

C:\Users\Name\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\series.py in apply(self, func, convert_dtype, args, **kwds)
   2292             else:
   2293                 values = self.asobject
-> 2294                 mapped = lib.map_infer(values, f, convert=convert_dtype)
   2295 
   2296         if len(mapped) and isinstance(mapped[0], Series):

pandas\src\inference.pyx in pandas.lib.map_infer (pandas\lib.c:66124)()

<ipython-input-17-a2b4920246a7> in Agg_type(x)
      8 
      9 def Agg_type(x):
---> 10     if search1 in x:
     11         return 'sum'
     12     elif search2 in x:

TypeError: argument of type 'float' is not iterable

1 个答案:

答案 0 :(得分:0)

你可以试试这个:

SampleDf['new_col'] = np.where(SampleDf.OtherField.str.contains("Avg"),"Avg",
                          np.where(SampleDf.OtherField.str.contains("Count"),"Count",
                                  np.where(SampleDf.OtherField.str.contains("Sum"),"Sum","Nothing")))

请注意,如果您在同一个字符串中没有AvgCountSum,这将正常工作。
如果你这样做,请注意我,我会寻找更好的方法 当然,如果某些事情不符合您的需求,也会报告回来 希望这很有帮助

说明:

正在发生的事情是,您正在寻找Avg列中OtherField列中的new_col索引,并在这些索引中填充Count和“平均”。对于剩余的字段(没有“平均”的字段),您会查找Sum并执行相同操作,最后对let parameters: [String : Any] = [ "names" : ["bob", "fred"] ] Alamofire.request(urlString, method: .post, parameters: parameters, encoding: URLEncoding.default) .responseJSON { response in // etc } 执行相同的操作。

文件:

np.where

pandas.series.str.contains