簡體   English   中英

TypeError:在 dataframe 中使用 lambda function 時,“float”類型的參數不可迭代

[英]TypeError: argument of type 'float' is not iterable when using lambda function in dataframe

從這個問題開始,我有這個 dataframe:

    ChildID   MotherID   preWeight
0     20      455        3500
1     20      455        4040
2     13      102        NaN
3     702     946        5000
4     82      571        2000
5     82      571        3500
6     82      571        3800

根據以下規則,我將每個 MotherID 具有多個觀察值的特征“preWeight”轉換為每個 MotherID 具有單個觀察值的特征“preMacro”:

  • 如果對於特定的 MotherID,preWeight>=4000,我將 preMacro 的值分配為“是”,而不管剩余的觀察結果如何
  • 否則,我為 preMacro 分配了“否”的值

使用這行代碼:

    df.groupby(['ChildID','MotherID']).agg(lambda x: 'Yes' if (x>4000).any() else 'No').reset_index().rename(columns={"preWeight": "preMacro"})

但是,我意識到這樣我並沒有保留數據集中的 NaN 值,理想情況下應該估算而不是僅僅為它們分配“否”值。 所以我嘗試將上面的行更改為:

    df=df.groupby(['MotherID', 'ChildID'])['preWeight'].agg(
        lambda x: 'Yes' if (x>4000).any() else (np.NaN if 'no_value' in x.values.all() else 'No')).reset_index().rename(
        columns={"preWeight": "preMacro"})

我希望這條線將上述 dataframe 轉換為:

    ChildID   MotherID   preMacro
0   20        455        Yes
1   13        102        NaN
2   702       946        Yes
3   82        571        No

但是我在運行它時遇到了這個錯誤:

TypeError:'float' 類型的參數不可迭代

我知道,在非缺失值的情況下, x.values.all() 的值是浮點數,它們是不可迭代的,但我不知道如何編寫這個代碼,有什么想法嗎?

謝謝。

For performance dont test in custom function per groups, better is aggregate by GroupBy.agg by helper column for boolean mask with GroupBy.all and GroupBy.any and then set column preMacro by numpy.select :

df = (df.assign(testconst = df['preWeight'] > 4000,
                testna = df['preWeight'].notna())
        .groupby(['ChildID','MotherID'], sort=False)
        .agg({'testconst':'any', 'testna':'all'}))


masks = [df['testconst'] & df['testna'], df['testconst'] | df['testna']]
df['preMacro'] = np.select(masks, ['Yes','No'], default=None)
df = df.drop(['testconst','testna'], axis=1).reset_index()
print (df)
   ChildID  MotherID preMacro
0       20       455      Yes
1       13       102     None <- for avoid convert np.NaN to string nan is used None
2      702       946      Yes
3       82       571       No

如果小 DataFrame 或者性能不重要:

f = lambda x: 'Yes' if (x>4000).any() else ('No' if x.notna().all() else np.NaN)
df1 = (df.groupby(['ChildID','MotherID'], sort=False)['preWeight']
         .agg(f)
         .reset_index(name='preMacro'))
print (df1)
   ChildID  MotherID preMacro
0       20       455      Yes
1       13       102      NaN
2      702       946      Yes
3       82       571       No

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM