2016-11-15 11 views
1

私は見たことがありますが、次の質問への答えが乾いているようです。データフレームと同じ長さの私はデータフレームに別の列を追加します(またはシリーズを生成)したいパンダのデータフレームにテキスト文字列データを含む条件付きデータを選択

 Type    Set 
    1 theGreen   Z 
    2 andGreen   Z   
    3 yellowRed   X 
    4 roadRed   Y 

(:

私はこれに類似したパンダのデータフレームを(「DF」と呼んで)持っています=等しい数のレコード/行)、タイプに文字列 "Green"が含まれている場合は数値コード変数(1)、そうでない場合は(0)が割り当てられます。

基本的に、私はこれを行うための方法を見つけようとしている。代わりに、通常のnumpyの演算子(!<、>、==、=、など)の場合を除き

df['color'] = np.where(df['Type'] == 'Green', 1, 0) 

私は方法が必要です「in」または「contains」と言っています。これは可能ですか?すべてのヘルプが高く評価されました!

答えて

1

使用str.contains

df['color'] = np.where(df['Type'].str.contains('Green'), 1, 0) 
print (df) 
     Type Set color 
1 theGreen Z  1 
2 andGreen Z  1 
3 yellowRed X  0 
4 roadRed Y  0 

applyのもう一つの解決策:

df['color'] = np.where(df['Type'].apply(lambda x: 'Green' in x), 1, 0) 
print (df) 
     Type Set color 
1 theGreen Z  1 
2 andGreen Z  1 
3 yellowRed X  0 
4 roadRed Y  0 

第二の溶液は高速ですが、errorを返し、その後、列TypeNaNでは動作しません:

TypeError: argument of type 'float' is not iterable

タイミング

#[400000 rows x 4 columns] 
df = pd.concat([df]*100000).reset_index(drop=True) 

In [276]: %timeit df['color'] = np.where(df['Type'].apply(lambda x: 'Green' in x), 1, 0) 
10 loops, best of 3: 94.1 ms per loop 

In [277]: %timeit df['color1'] = np.where(df['Type'].str.contains('Green'), 1, 0) 
1 loop, best of 3: 256 ms per loop 
+0

あなたが '' 'NaN'''とラムダの代わりにそれを適用し処理する関数を記述してもらえますか? – wwii

+0

@wwii私は電話だけです。私は明日解決策を追加します。 – jezrael

+0

@wwii - それはもっと複雑です - 私にとっては 'df ['color'] = np.where(df ['Type']。apply(lambda x: 'Green'はxならばpd.notnull(x) )、1、 nf.where(df ['Type']。isnull()、np.nan、0)) 'df = pd.DataFrame({ 'Set':{1: 'Z'、2 : 'Z'、3: 'X'、4: 'Y'}、 'タイプ':{1: 'theGreen'、2: 'andGreen'、3: 'yellowRed'、4:np.nan}}、 '' Type ''、 'Set']) ' – jezrael

関連する問題