从Python中的多个列中删除相同的元素

从Python中的多个列中删除相同的元素,python,pandas,pivot-table,spyder,Python,Pandas,Pivot Table,Spyder,我使用的是Python,我有很多列添加了一些符号 因此,如果一列曾经是“a”,那么现在它会说“('a',''”。所以我需要删除('和','')。有些变量(更准确地说是400)本应称为“1A”,但称为“('A',1)”。因此,对于这些,我需要删除('和',)并将数字移动到A的前面。在pivot_table命令之后,它们变成了这样 所以我需要从之前到之后: data_before = {"('A', '')" : ['a', 'b', 'c'], "('B', '')"

我使用的是Python,我有很多列添加了一些符号

因此,如果一列曾经是“a”,那么现在它会说“('a',''”。所以我需要删除('和','')。有些变量(更准确地说是400)本应称为“1A”,但称为“('A',1)”。因此,对于这些,我需要删除('和',)并将数字移动到A的前面。在pivot_table命令之后,它们变成了这样

所以我需要从之前到之后:

data_before = {"('A', '')" : ['a', 'b', 'c'],
               "('B', '')" : ['p', 'o', 'n'],
               "('C', 1)"  : [1, 1, 1], 
               "('C', 2)"  : [1, 2, 1], 
               "('D', 1)"  : [1, 2, 4],
               "('D', 2)"  : [1, 5, 3]}

df = pd.DataFrame(data=data_before)

data_after = {'A'    : ['a', 'b', 'c'],
              'B'    : ['p', 'o', 'n'],
              '1 C'  : [1, 1, 1], 
              '2 C'  : [1, 2, 1], 
              '1 D'  : [1, 2, 4],
              '2 D'  : [1, 5, 3]}

df_2 = pd.DataFrame(data=data_after)
请记住,有42个变量看起来像C和D,每个变量从1到10(不仅仅是2),因此有420列。我不想手动写下每一个来更改名称。只有前三个变量看起来像A和B(总共423列)

更新以容纳更多字母和数字。所以1c,2c。。。10度和1度,2度。。。10 Z

data_before = {"('A', '')" : ['a', 'b', 'c'],
               "('B', '')" : ['p', 'o', 'n'],
               "('C', 1)"  : [1, 1, 1], 
               "('C', 2)"  : [1, 2, 1], 
               "('C', 3)"  : [3, 2, 1], 
               "('D', 1)"  : [1, 2, 3],
               "('D', 2)"  : [1, 2, 3],
               "('D', 3)"  : [1, 2, 3],
               "('E', 1)"  : [1, 1, 1], 
               "('E', 2)"  : [1, 2, 1], 
               "('E', 3)"  : [3, 2, 1]}

df = pd.DataFrame(data=data_before)

data_after = {'A'    : ['a', 'b', 'c'],
              'B'    : ['p', 'o', 'n'],
              '1 C'  : [1, 1, 1], 
              '2 C'  : [1, 2, 1], 
              '3 C'  : [3, 2, 1], 
              '1 D'  : [1, 2, 3], 
              '2 D'  : [1, 2, 3],
              '3 D'  : [1, 2, 3]
              '1 E'  : [1, 1, 1], 
              '2 E'  : [1, 2, 1],
              '3 E'  : [3, 2, 1]}

df_2 = pd.DataFrame(data=data_after)
此命令:

df.columns = [f'{b} {a}'.strip() for a, b in df.columns]
返回:

ValueError: too many values to unpack (expected 2)

如果存在元组或可以使用
f-strings
strip

data_before = {('A', '') : ['a', 'b', 'c'],
               ('B', '') : ['p', 'o', 'n'],
               ('C', 1) : [1, 1, 1], 
               ('C', 2)  : [1, 2, 1], 
               ('D', 1)  : [1, 2, np.NaN],
               ('D', 2)  : [1, np.NaN, 3]}

df = pd.DataFrame(data=data_before)

df.columns = [f'{b} {a}'.strip() for a, b in df.columns]
print (df)
   A  B  1 C  2 C  1 D  2 D
0  a  p    1    1  1.0  1.0
1  b  o    1    2  2.0  NaN
2  c  n    1    1  NaN  3.0
编辑:


您只需首先删除所有无用的字符,然后拆分并反转字符串

import re 
df.columns = [" ".join(reversed(re.sub(r"\)|\(|'|,", "", x).split()))
              for x in df.columns]

为你修正了。我的解决方案对你有效吗?对我有效,但要使解决方案完整,1和2也应该移到字母的前面@Jezraelth如果你有C1,C2,关于改变位置的部分是有效的,但是如果它上升到10,你有整个字母表呢?我收到以下错误:ValueError:要解压缩的值太多(预期为2个)@jezrael@nielsen-那么这里的逻辑是什么?您需要对它们进行排序吗?在处理数据时,我看不到数字,并且它在显示数据时提供了更好的概览。@尼尔森-数字总是最后一个值?这适用于手头的数据。这是一个非常好的解决方案。我一直意识到我的mwe不够好。字母A、B、C、D、E。。表示在我的数据中较长的名称,而这种解决方案似乎不起作用。但我会给它一个“解决”,因为它在这里工作。
import re 
df.columns = [" ".join(reversed(re.sub(r"\)|\(|'|,", "", x).split()))
              for x in df.columns]