パンダはラムダ関数のnull値を適用します

フライングミートボール

列を2つに分割しようとしていますが、データにnull値があることがわかっています。このデータフレームを想像してみてください。

df = pd.DataFrame(['fruit: apple','vegetable: asparagus',None, 'fruit: pear'], columns = ['text'])

df

                   text
0          fruit: apple
1  vegetable: asparagus
2                   None
3           fruit: pear

これを次のように複数の列に分割したいと思います。

df['cat'] = df['text'].apply(lambda x: 'unknown' if x == None else x.split(': ')[0])
df['value'] = df['text'].apply(lambda x: 'unknown' if x == None else x.split(': ')[1])

print df

                   text        cat      value
0          fruit: apple      fruit      apple
1  vegetable: asparagus  vegetable  asparagus
2                  None    unknown    unknown
3           fruit: pear      fruit       pear

ただし、代わりに次のdfがある場合:

df = pd.DataFrame(['fruit: apple','vegetable: asparagus',np.nan, 'fruit: pear'], columns = ['text'])

分割すると、次のエラーが発生します。

df['cat'] = df['text'].apply(lambda x: 'unknown' if x == np.nan else x.split(': ')[0])

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-159-8e5bca809635> in <module>()
      1 df = pd.DataFrame(['fruit: apple','vegetable: asparagus',np.nan, 'fruit: pear'], columns = ['text'])
      2 #df.columns = ['col_name']
----> 3 df['cat'] = df['text'].apply(lambda x: 'unknown' if x == np.nan else x.split(': ')[0])
      4 df['value'] = df['text'].apply(lambda x: 'unknown' if x == np.nan else x.split(': ')[1])

C:\Python27\lib\site-packages\pandas\core\series.pyc in apply(self, func, convert_dtype, args, **kwds)
   2158             values = lib.map_infer(values, lib.Timestamp)
   2159 
-> 2160         mapped = lib.map_infer(values, f, convert=convert_dtype)
   2161         if len(mapped) and isinstance(mapped[0], Series):
   2162             from pandas.core.frame import DataFrame

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

<ipython-input-159-8e5bca809635> in <lambda>(x)
      1 df = pd.DataFrame(['fruit: apple','vegetable: asparagus',np.nan, 'fruit: pear'], columns = ['text'])
      2 #df.columns = ['col_name']
----> 3 df['cat'] = df['text'].apply(lambda x: 'unknown' if x == np.nan else x.split(': ')[0])
      4 df['value'] = df['text'].apply(lambda x: 'unknown' if x == np.nan else x.split(': ')[1])

AttributeError: 'float' object has no attribute 'split'

NaN値で同じ分割を行うにはどうすればよいですか?null値を無視する分割関数を適用するためのより良い方法は一般的にありますか?

これが文字列の例ではなく、次のような場合を想像してみてください。

df = pd.DataFrame([2,4,6,8,10,np.nan,12], columns = ['numerics'])
df['numerics'].apply(lambda x: np.nan if pd.isnull(x) else x/2.0)

Series.applyは、null行をスキップしてnullとして出力するように指示する引数を取る必要があるように感じます。手動でnullを回避せずに、シリーズへの変換を行うためのより一般的な方法は見つかりませんでした

忘れてください

applyカスタム関数を使用する代わりに、次のSeries.str.extract方法を使用できます

import numpy as np
import pandas as pd
# df = pd.DataFrame(['fruit: apple','vegetable: asparagus',None, 'fruit: pear'], 
#                   columns = ['text'])
df = pd.DataFrame(['fruit: apple','vegetable: asparagus',np.nan, 'fruit: pear'], 
                  columns = ['text'])
df[['cat', 'value']] = df['text'].str.extract(r'([^:]+):?(.*)', expand=True).fillna('unknown')
print(df)

収量

                   text        cat       value
0          fruit: apple      fruit       apple
1  vegetable: asparagus  vegetable   asparagus
2                   NaN    unknown     unknown
3           fruit: pear      fruit        pear

applyカスタム関数を使用すると、一般に、などのベクトル化されたメソッドを使用する同等のコードよりも低速になりますSeries.str.extractapply内部的には(ベクトル化できない関数を使用して)基本的にPythonのカスタム関数を呼び出しますfor-loop


編集された質問について:あなたが持っている場合

df = pd.DataFrame([2,4,6,8,10,np.nan,12], columns = ['numerics'])

次に使用します

In [207]: df['numerics']/2
Out[207]: 
0    1.0
1    2.0
2    3.0
3    4.0
4    5.0
5    NaN
6    6.0
Name: numerics, dtype: float64

の代わりに

df['numerics'].apply(lambda x: np.nan if pd.isnull(x) else x/2.0)

繰り返しますapplyが、カスタム関数を使用したベクトル化された算術ビート

In [210]: df = pd.concat([df]*100, ignore_index=True)

In [211]: %timeit df['numerics']/2
10000 loops, best of 3: 93.8 µs per loop

In [212]: %timeit df['numerics'].apply(lambda x: np.nan if pd.isnull(x) else x/2.0)
1000 loops, best of 3: 836 µs per loop

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

パンダ-関数を適用し、ラムダ関数を使用して複数の行を生成します

分類Dev

列の値がNULLでない場合、Pythonパンダは関数を適用します

分類Dev

パンダにラムダを使用した関数を適用します

分類Dev

パンダは、パンダデータフレームの行に複数の値を返す関数を適用します

分類Dev

パンダの行の値のリストに関数を適用します

分類Dev

ラムダはパンダの値に適用し、前後の行の平均を取ります

分類Dev

パンダの別の列の値に基づいてgroupbyの後にラムダ関数を適用します

分類Dev

パンダは値エラーをスローする関数を適用します

分類Dev

パンダは複数の列に行方向の関数を適用します

分類Dev

パンダは複数の列のデータフレームに関数を適用します

分類Dev

パンダは引数付きの関数を適用します

分類Dev

ilocパンダの関数を使用して適用します

分類Dev

パンダは前の列の値をとって列に関数を適用します

分類Dev

パンダは多重指数に関数を適用します

分類Dev

パンダは列に関数を適用します

分類Dev

各n行のパンダに関数を適用します

分類Dev

行列のランダムな行に関数を適用します

分類Dev

パンダは複数の値を適用して返します

分類Dev

パンダのデータフレームは列全体に関数を適用します

分類Dev

group byを使用し、前の行の値を使用してラムダ関数を適用します

分類Dev

パンダ-ラムダ関数に適用される列の中央値

分類Dev

パンダはグループ化して数値列に関数を適用します

分類Dev

パンダ:ローリング関数を適用して新しい列の値を計算します

分類Dev

パンダ-各列に複数の値を返す関数を適用します

分類Dev

パンダは他の列の値に基づいて新しい列を作成します/複数の列の関数を行ごとに適用します

分類Dev

パンダが関数を適用する理由はなしを返します

分類Dev

パンダからの一貫性のない出力は、関数パラメーターとしてnp.stdを使用して関数を適用します

分類Dev

パンダは関数を適用します-引数はどのように渡されますか

分類Dev

パンダは関数を適用してNotImplementedErrorをスローします

Related 関連記事

  1. 1

    パンダ-関数を適用し、ラムダ関数を使用して複数の行を生成します

  2. 2

    列の値がNULLでない場合、Pythonパンダは関数を適用します

  3. 3

    パンダにラムダを使用した関数を適用します

  4. 4

    パンダは、パンダデータフレームの行に複数の値を返す関数を適用します

  5. 5

    パンダの行の値のリストに関数を適用します

  6. 6

    ラムダはパンダの値に適用し、前後の行の平均を取ります

  7. 7

    パンダの別の列の値に基づいてgroupbyの後にラムダ関数を適用します

  8. 8

    パンダは値エラーをスローする関数を適用します

  9. 9

    パンダは複数の列に行方向の関数を適用します

  10. 10

    パンダは複数の列のデータフレームに関数を適用します

  11. 11

    パンダは引数付きの関数を適用します

  12. 12

    ilocパンダの関数を使用して適用します

  13. 13

    パンダは前の列の値をとって列に関数を適用します

  14. 14

    パンダは多重指数に関数を適用します

  15. 15

    パンダは列に関数を適用します

  16. 16

    各n行のパンダに関数を適用します

  17. 17

    行列のランダムな行に関数を適用します

  18. 18

    パンダは複数の値を適用して返します

  19. 19

    パンダのデータフレームは列全体に関数を適用します

  20. 20

    group byを使用し、前の行の値を使用してラムダ関数を適用します

  21. 21

    パンダ-ラムダ関数に適用される列の中央値

  22. 22

    パンダはグループ化して数値列に関数を適用します

  23. 23

    パンダ:ローリング関数を適用して新しい列の値を計算します

  24. 24

    パンダ-各列に複数の値を返す関数を適用します

  25. 25

    パンダは他の列の値に基づいて新しい列を作成します/複数の列の関数を行ごとに適用します

  26. 26

    パンダが関数を適用する理由はなしを返します

  27. 27

    パンダからの一貫性のない出力は、関数パラメーターとしてnp.stdを使用して関数を適用します

  28. 28

    パンダは関数を適用します-引数はどのように渡されますか

  29. 29

    パンダは関数を適用してNotImplementedErrorをスローします

ホットタグ

アーカイブ