有多组列名重复,想删除数据相同的列,保留数据不同的列,并修改列名
-
df中有很多列的时候,可能会出现列名重复的情况,而列名重复的时候,可能对应的数据是完全相同的,这个时候我们就想删掉重复的列只保留一列就行了;有的时候列名虽然是相同的,但是数据是完全不同的,所以这个时候我们往往需要把列名重复的给重命名了。
-
当然可能还会有其他情况,但是今天我就同时遇到了这两个问题:
df中有三个列名分别为“时间”、“型号”、“忘了”,然后这三个列竟都分别出现了4次,这四组是完全相同的,可我只需要1组就够了,剩下3组我想删掉,本来我可以用 下面代码 完美实现去除重复列并保留前面的不被删掉。
df = df.loc[:,~df.columns.duplicated()]
-
可偏偏!里面还有4列叫“电压”的列,而且这4列的值都不相同,只是名字一样,这样一来,我再用上面的方法,就会把后面无辜的3列电压也给删掉了。
-
也就是 df 中的列名如果放到列表里形式是这样的
[‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘e’, ‘e’, ‘e’, ‘a’, ‘b’, ‘c’, ‘f’, ‘a’, ‘b’, ‘c’, ‘g’, ‘a’, ‘b’, ‘c’, ‘h’, ‘i’]
.
其中的 ‘a’, ‘b’, ‘c’ 就可以理解为是“时间”、“型号”、“忘了”这3列
其中的 ‘e’, ‘e’, ‘e’, ‘e’ 就可以理解为是“电压”列
-
所以我发现了一篇文章,找到了很好的解决办法:
-
参考文章的链接: pandas给重名的列重命名的三种方法.
-
使用这里的第一个匿名函数的方法,成功帮我解决了这个问题!
date_name = {'时间': ['时间', '时间2', '时间3', '时间4']}
N_name = {'型号': ['型号', '型号2', '型号3', '型号4']}
C_name = {'忘了': ['忘了', '忘了2', '忘了3', '忘了4']}
V_name = {'电压': ['电压', '电压2', '电压3', '电压4']}
df = df.rename(columns=lambda date: date_name[date].pop(0) if date in date_name.keys() else date)
df = df.rename(columns=lambda N: N_name[N].pop(0) if N in N_name.keys() else N)
df = df.rename(columns=lambda C: C_name[C].pop(0) if C in C_name.keys() else C)
df = df.rename(columns=lambda V: V_name[V].pop(0) if V in V_name.keys() else V)
# print(df.columns)
df.drop(columns=['时间', '时间2', '时间3', '时间4', '型号', '型号2', '型号3', '型号4', '忘了2', '忘了3', '忘了4'], inplace=True)
- 可能还有更简洁的写法,但是至少为我提供了一个解决问题的思路。