从pandas数据框中删除重复列:转置和drop_duplicates的行为

0 投票
1 回答
2052 浏览
提问于 2025-04-18 09:26

我在玩一个叫 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]:

为什么这个方法不行呢?

1 个回答

2

第二种方式确实有效(df.T.drop_duplicates(inplace=True)),但它是在一个副本上操作(转置本身并不会复制,但drop_duplicates会复制);所以它是在修改一个你没有引用的副本。

几乎所有的pandas操作都会返回一个新对象;这才是正确的用法,inplace是一个方便的功能,但必须小心使用(在我看来,真的很少用)。

撰写回答