290

パンダでこれを行う方法:

extract_text_features複数の出力列を返す単一のテキスト列に関数があります。具体的には、この関数は 6 つの値を返します。

関数は機能しますが、出力が正しく割り当てられるような適切な戻り値の型 (pandas DataFrame/numpy array/Python リスト) がないようです。df.ix[: ,10:16] = df.textcol.map(extract_text_features)

df.iterrows()だから私はこのように、との繰り返しに戻る必要があると思います?

更新: での反復df.iterrows()は少なくとも 20 倍遅いため、降伏して関数を 6 つの異なる.map(lambda ...)呼び出しに分割しました。

更新 2: この質問は、 v0.16 で使いやすさが改善されるか追加される前に、 v0.11.0 の頃に尋ねられまし。したがって、質問と回答の多くはあまり関連性がありません。df.applydf.assign()

4

14 に答える 14

129

user1827356 の回答から構築すると、次を使用して1回のパスで割り当てを行うことができますdf.merge

df.merge(df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1})), 
    left_index=True, right_index=True)

    textcol  feature1  feature2
0  0.772692  1.772692 -0.227308
1  0.857210  1.857210 -0.142790
2  0.065639  1.065639 -0.934361
3  0.819160  1.819160 -0.180840
4  0.088212  1.088212 -0.911788

編集: 大量のメモリ消費と低速に注意してください: https://ys-l.github.io/posts/2015/08/28/how-not-to-use-pandas-apply/ !

于 2013-04-26T20:57:06.977 に答える
91

これは私が過去にやったことです

df = pd.DataFrame({'textcol' : np.random.rand(5)})

df
    textcol
0  0.626524
1  0.119967
2  0.803650
3  0.100880
4  0.017859

df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1}))
   feature1  feature2
0  1.626524 -0.373476
1  1.119967 -0.880033
2  1.803650 -0.196350
3  1.100880 -0.899120
4  1.017859 -0.982141

完全性のための編集

pd.concat([df, df.textcol.apply(lambda s: pd.Series({'feature1':s+1, 'feature2':s-1}))], axis=1)
    textcol feature1  feature2
0  0.626524 1.626524 -0.373476
1  0.119967 1.119967 -0.880033
2  0.803650 1.803650 -0.196350
3  0.100880 1.100880 -0.899120
4  0.017859 1.017859 -0.982141
于 2013-04-26T17:39:39.793 に答える
1

値の代わりに行全体を返すことができます:

df = df.apply(extract_text_features,axis = 1)

関数が行を返す場所

def extract_text_features(row):
      row['new_col1'] = value1
      row['new_col2'] = value2
      return row
于 2018-06-24T19:06:57.283 に答える