python pandas删除重复的列

标签 python pandas

从数据框中删除重复列的最简单方法是什么?

我正在通过以下方式读取具有重复列的文本文件:

import pandas as pd

df=pd.read_table(fname)

列名是:

Time, Time Relative, N2, Time, Time Relative, H2, etc...

所有时间和时间相对列都包含相同的数据。我要:

Time, Time Relative, N2, H2

我在删除、删除等方面的所有尝试,例如:

df=df.T.drop_duplicates().T

导致唯一值索引错误:

Reindexing only valid with uniquely valued index objects

很抱歉成为 Pandas 菜鸟。任何建议将不胜感激。


其他详情

Pandas 版本:0.9.0
Python版本:2.7.3
window 7
(通过 Pythonxy 2.7.3.0 安装)

数据文件(注意:在真实文件中,列用制表符分隔,这里用4个空格分隔):

Time    Time Relative [s]    N2[%]    Time    Time Relative [s]    H2[ppm]
2/12/2013 9:20:55 AM    6.177    9.99268e+001    2/12/2013 9:20:55 AM    6.177    3.216293e-005    
2/12/2013 9:21:06 AM    17.689    9.99296e+001    2/12/2013 9:21:06 AM    17.689    3.841667e-005    
2/12/2013 9:21:18 AM    29.186    9.992954e+001    2/12/2013 9:21:18 AM    29.186    3.880365e-005    
... etc ...
2/12/2013 2:12:44 PM    17515.269    9.991756+001    2/12/2013 2:12:44 PM    17515.269    2.800279e-005    
2/12/2013 2:12:55 PM    17526.769    9.991754e+001    2/12/2013 2:12:55 PM    17526.769    2.880386e-005
2/12/2013 2:13:07 PM    17538.273    9.991797e+001    2/12/2013 2:13:07 PM    17538.273    3.131447e-005

最佳答案

这是一个基于重复的列名删除列的单行解决方案:

df = df.loc[:,~df.columns.duplicated()].copy()

工作原理:

假设数据框的列是['alpha','beta','alpha']

df.columns.duplicated() 返回一个 bool 数组:每列都有一个 TrueFalse。如果它是 False 则列名在该点之前是唯一的,如果它是 True 则列名在前面是重复的。例如,使用给定的示例,返回值将是 [False,False,True]

Pandas 允许使用 bool 值进行索引,从而只选择 True 值。由于我们要保留不重复的列,我们需要将上面的 bool 数组进行翻转(即 [True, True, False] = ~[False,False,True])

最后,df.loc[:,[True,True,False]] 使用上述索引功能仅选择不重复的列。

最后的 .copy() 用于将数据帧复制到(主要)避免在稍后尝试修改现有数据帧时出错。

注意:以上只检查列名,列值。

删除重复索引

既然足够相似,就在索引上做同样的事情:

df = df.loc[~df.index.duplicated(),:].copy()

通过检查值而不转置来删除重复项

df = df.loc[:,~df.apply(lambda x: x.duplicated(),axis=1).all()].copy()

这避免了转置的问题。快吗?不,它有效吗?是的。在这里,试试这个:

# create a large(ish) dataframe
ldf = pd.DataFrame(np.random.randint(0,100,size= (736334,1312))) 


#to see size in gigs
#ldf.memory_usage().sum()/1e9 #it's about 3 gigs

# duplicate a column
ldf.loc[:,'dup'] = ldf.loc[:,101]

# take out duplicated columns by values
ldf = ldf.loc[:,~ldf.apply(lambda x: x.duplicated(),axis=1).all()].copy()

关于python pandas删除重复的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14984119/

相关文章:

python - 如何使用 Numpy 获取列表的总和及其乘积

python 3, window 7 :ConnectionResetError: [WinError 10054] An existing connection was forcibly closed by the remote host

python - "for-in loop"的学习索引

python - SKlearn X 和 Y 的 reshape 警告

python - 根据应用于两个数据帧的条件创建第三个数据帧

python - 将线图重叠到 pandas 中的水平条形图

python - 将 PyArrayObject 数据类型转换为 C 数组

python - 仅转置 pandas MultiIndex 数据帧的一个级别

python - 带有 x 轴范围的 Pandas 箱线图

python - Pandas:如何用 groupby 的平均值填充空值?