私はより良いがmask
を使用していると思います - 他sex
列からTrue
boolean mask
でGET値が新しい列にchild
文字列を取得する場合:ソリューションの
print (exampleDF['age'] < 15)
0 False
1 True
2 False
3 True
4 False
5 True
Name: age, dtype: bool
exampleDF['newColumn'] = exampleDF['sex'].mask(exampleDF['age'] < 15, 'child')
print (exampleDF)
name age sex newColumn
0 a 21 male male
1 b 13 female child
2 c 56 female female
3 d 12 male child
4 e 45 NaN NaN
5 f 10 female child
主な利点は、それが高速である:
#small 6 rows df
In [63]: %timeit exampleDF['sex'].mask(exampleDF['age'] < 15, 'child')
1000 loops, best of 3: 517 µs per loop
In [64]: %timeit exampleDF[['age','sex']].apply(lambda x: 'child' if x['age'] < 15 else x['sex'],axis=1)
1000 loops, best of 3: 867 µs per loop
#bigger 6k df
exampleDF = pd.concat([exampleDF]*1000).reset_index(drop=True)
In [66]: %timeit exampleDF['sex'].mask(exampleDF['age'] < 15, 'child')
The slowest run took 5.41 times longer than the fastest. This could mean that an intermediate result is being cached.
1000 loops, best of 3: 589 µs per loop
In [67]: %timeit exampleDF[['age','sex']].apply(lambda x: 'child' if x['age'] < 15 else x['sex'],axis=1)
10 loops, best of 3: 104 ms per loop
#bigger 60k df - apply very slow
exampleDF = pd.concat([exampleDF]*10000).reset_index(drop=True)
In [69]: %timeit exampleDF['sex'].mask(exampleDF['age'] < 15, 'child')
1000 loops, best of 3: 1.23 ms per loop
In [70]: %timeit exampleDF[['age','sex']].apply(lambda x: 'child' if x['age'] < 15 else x['sex'],axis=1)
1 loop, best of 3: 1.03 s per loop
これは非常にばかな質問かもしれませんが、いつ 'axis = 1 'を指定する必要がありますか?私は以前に軸を指定せずにラムダでapply関数を使用しました。 – Harj
デフォルトではaxis = 0なので、行に関数を適用します(http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.apply.htmlを参照)。これは以前あなたが望んでいたものです。ただし、x ['age']とx ['sex']の2つのカラムに適用したいので、axis = 1を指定する必要があります。 –
前のコメントを続けると、2つの例があります:最初の例はexampleDF ['newColumn'] = exampleDF [['age']]。apply(lambda x:x ** 2)です。ここでは、exampleDF [['age']]の各要素に四角形のアクションを適用するだけで、axis = 1を指定する必要はありません。しかし、次の例では、exampleDF ['newColumn'] = exampleDF [['age']]。apply(x ['age']> 15ならばlambda x:True、それ以外の場合はFalse、axis = 1)axis = 1は関数が列全体に直接適用されるためです。 –