2016-09-12 10 views
1

df[columns]df.loc[:,columns]の違いは、左辺値と右辺値の両方ですか?pandas.DataFrame列にアクセスするさまざまな方法

彼らは行動POVから交換可能であると思われる:

>>> df = pd.DataFrame({'x':[1,2,3],'y':['a','b','c']}) 
>>> df[['x']].equals(df.loc[:,['x']]) 
True 
>>> df.loc[:,'z'] = df.x.apply(str) + df.y 
>>> df['a'] = df.x.apply(str) + df.y 
>>> df 
    x y z a 
0 1 a 1a 1a 
1 2 b 2b 2b 
2 3 c 3c 3c 

私はどこかに耐え難いほどの細部でこれに答える文書が存在しているはず(と私は一度もそれを見て確信しているが、リンクがいいだろう)、しかし、私は "エグゼクティブサマリー"を見ています。

具体的には:もう一方のショートカットですか?それとも意味的に違いがありますか?

PS。これは、メッセージ

〜/ .virtualenvs /ウィルバー/ libに/ python2.7 /のsite-packages /パンダ/コア/ indexing.pyによって促される:465:SettingWithCopyWarning: 値がオンに設定されるようにしようとしていますDataFrameからのスライスのコピー。 代わりに.loc [row_indexer、col_indexer] = valueを使用してみてください

+0

私はあなたの質問を理解していません。あなたはここで何が起こっているのか知りたいですか? –

+2

はい - どちらが速く/安く/安全であるかのように – sds

+0

私は 'ix'フィルタリングが速いと思いますが、100%確実にする必要がある場合はさらにテストが必要です –

答えて

0

300K行DFのタイミング比較はどうですか?

In [22]: big = pd.concat([df] * 10**5, ignore_index=True) 

In [23]: %timeit -n 1 -r 1 big['n1'] = big.x.apply(str) + big.y 
1 loop, best of 1: 266 ms per loop 

In [24]: %timeit -n1 -r 1 big.ix[:, 'n2'] = big.x.apply(str) + big.y 
1 loop, best of 1: 317 ms per loop 

In [25]: %timeit -n 1 -r 1 big.loc[:, 'n3'] = big.x.apply(str) + big.y 
1 loop, best of 1: 333 ms per loop 

In [26]: %timeit -n 1 -r 1 big.insert(len(big.columns), 'n4', big.x.apply(str) + big.y) 
1 loop, best of 1: 266 ms per loop 

In [27]: big.shape 
Out[27]: (300000, 6) 

In [28]: big.head() 
Out[28]: 
    x y n1 n2 n3 n4 
0 1 a 1a 1a 1a 1a 
1 2 b 2b 2b 2b 2b 
2 3 c 3c 3c 3c 3c 
3 1 a 1a 1a 1a 1a 
4 2 b 2b 2b 2b 2b 
関連する問題