2016-09-12 22 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 /站點包/熊貓/核心/ indexing.py:465:SettingWithCopyWarning: 值要試圖設置來自DataFrame的切片副本。 嘗試使用.loc [row_indexer,col_indexer] =值代替

+0

我不明白你的問題。你想知道引擎蓋下發生了什麼? –

+2

是的 - 比如哪一個應該更快/更便宜/更安全&c – 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