2014-06-11 68 views
0

所以我在玩drop_duplicates()。假設我有一個有重複列的數據幀:刪除熊貓數據框中的重複列:轉置行爲+ drop_duplicates

In [9]: 

df1 = pd.DataFrame(data=nr.random((3,2))) 
df1 
Out[9]: 
0 1 
0 0.441663 0.396479 
1 0.079502 0.715348 
2 0.692295 0.069418 
3 rows × 2 columns 
In [10]: 

df2 = pd.concat((df1, df1), axis=1) 
df2 
Out[10]: 
0 1 0 1 
0 0.441663 0.396479 0.441663 0.396479 
1 0.079502 0.715348 0.079502 0.715348 
2 0.692295 0.069418 0.692295 0.069418 
3 rows × 4 columns 
In [11]: 

我想刪除重複的列。以下作品:

df2.T.drop_duplicates().T 
Out[12]: 
0 1 
0 0.441663 0.396479 
1 0.079502 0.715348 
2 0.692295 0.069418 
3 rows × 2 columns 

然而,這不起作用:

df2.T.drop_duplicates(inplace=True) 
df2 
Out[11]: 
0 1 0 1 
0 0.441663 0.396479 0.441663 0.396479 
1 0.079502 0.715348 0.079502 0.715348 
2 0.692295 0.069418 0.692295 0.069418 
3 rows × 4 columns 
In [12]: 

爲什麼它不工作?

回答

2

第2形式確實工作(df.T.drop_duplicates(inplace=True)),但它在副本上操作(轉置本身不復制,但drop_duplicates一樣);所以它正在修改你沒有參考的副本。

幾乎所有的熊貓操作都返回一個新的對象;這是正確的成語,inplace是一個易於使用的功能,必須小心使用(或恕我直言,非常非常罕見)。

+0

現在我很困惑。是不是'inplace'用來明確避免拷貝? –

+0

只有一小部分操作實際上可以在沒有使用副本的情況下完成。現場背後的大多數就地行動實際上是複製。這就是爲什麼恕我直言''inplace''操作合成負擔沉重,而且大多是無用的。 – Jeff