2017-07-08 5 views
0

Ich habe Daten wie die SampleDf Daten unten. Ich versuche Werte in einer Spalte in meinem Datenrahmen zu überprüfen, um zu sehen, ob sie 'Summe' oder 'Anzahl' oder 'Avg' enthalten, und erstelle dann eine neue Spalte mit dem Wert 'Summe', 'Anzahl' oder 'Avg' . Wenn ich den unten stehenden Code auf meinem realen Datenfeld ausführe, erhalte ich den Fehler unten. Wenn ich dtypes auf meinem realen Datenrahmen laufe, sagt es, dass alle Spalten Objekte sind. Der folgende Code bezieht sich auf den Post unten. Leider bekomme ich nicht die gleichen Fehler, wenn ich den Code auf SampleDf ausführe, den ich zur Verfügung gestellt habe, aber ich konnte meinen ganzen Datenrahmen nicht veröffentlichen.Pandas Error Matching String

Beitrag: 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 
+0

Ich kann Ihren Fehler mit diesen Daten nicht reproduzieren, aber ich kann, wenn ich über die '['OtherField']' Spalte mit einer Liste von Gleitkommazahlen schreibe, Ihre Funktion sieht gut aus - das Problem scheint mit dem Dtype Ihres 'zu sein ['OtherField'] 'spalte – cmaher

+0

ist es okey, wenn ich eine lösung anbiete, die funktioniert b ut das unterscheidet sich von dir? einfach, weil Ihr Code für mich auch keinen Fehler ausgelöst hat –

+1

@RayhaneMama Vielen Dank für die Rückmeldung an mich, ja, bitte geben Sie Ihre Lösung. – ndderwerdo

Antwort

0

Sie können dies versuchen:

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"))) 

Bitte beachten Sie, dass diese ordnungsgemäß funktionieren, wenn Sie nicht beide Avg und Count oder Sum in derselben Saite .
Wenn Sie, bitte beachten Sie mich, ich werde nach einem besseren Ansatz suchen.
Natürlich, wenn etwas nicht Ihren Bedürfnissen entspricht, melden Sie es auch zurück.
Hoffnung, das war hilfreich

Erklärung:

, was passiert, ist, dass Sie für Indizes sind, wo Avg in der Zeichenfolge innerhalb OtherField Spalte ist und new_col mit „Avg“ in diesen Indizes füllen. für die restlichen Felder (wo nicht „Avg“ gibt, suchen Sie Count und das gleiche tun und halten Sie für Sum das gleiche tun

Dokumentation.

np.where

pandas.series.str.contains

+0

Danke, das hat den Trick gemacht. Verstehst du den Unterschied zwischen dem, was mein Code getan hat und was dein Code tut? Ich versuche zu verstehen, warum die Pandas-Version nicht funktioniert hat. Ich habe mir die Daten angesehen, es scheint, als würden Strings nicht schweben. – ndderwerdo

+0

Ja, ich habe diesen Fehler auch ein paar Mal bekommen, ich bin mir nicht sicher, warum es aber knallt. Das Drucken von df.dtypes zeigt, dass ich keine Schwimmer habe, aber gut ... ich suche immer noch nach der Ursache. Ich werde Sie benachrichtigt @ndderwerdo –

+0

@ndderwerdo Ich habe gerade Ihren Code getestet und es funktioniert, also, wenn es immer noch nicht funktioniert für Sie, ich glaube nicht, es ist mit dem Code, den Sie veröffentlicht. –