【问题标题】:Remove same elements from multiple columns in Python从 Python 中的多个列中删除相同的元素
【发布时间】:2020-08-06 12:53:16
【问题描述】:

我正在使用 Python,并且我有一堆添加了一些符号的列。

因此,如果一列曾经是“A”,现在它会显示“('A', '')”。所以我需要删除('和','')。一些变量(更准确地说是 400)应该被称为“1 A”,但被称为“('A',1)”。所以对于这些我需要删除 (' and ', ) 并将数字移动到 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 列。我不想手动写下它们中的每一个来更改名称。只有前 3 个变量看起来像 A 和 B。(总共 423 列)。

更新以容纳更多字母和数字。所以 1 C, 2 C... 10 C 和 1 Z, 2 Z ... 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)

【问题讨论】:

  • 已为您修复。
  • 我的解决方案对你有用吗?

标签: python pandas pivot-table spyder


【解决方案1】:

如果有元组或MultiIndex 可以使用f-stringsstrip

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 ast

df.columns = [f'{b} {a}'.strip() for a, b in df.columns.map(ast.literal_eval)]

print (df)
   A  B  1 C  2 C  3 C  1 D  2 D  3 D  1 E  2 E  3 E
0  a  p    1    1    3    1    1    1    1    1    3
1  b  o    1    2    2    2    2    2    1    2    2
2  c  n    1    1    1    3    3    3    1    1    1

【讨论】:

  • 这对我有用,但是为了使解决方案完整,1 和 2 也应该移到字母的前面。 @jezrael
  • 例如,如果您有 C 1、C 2,则有关更改位置的部分有效,但如果它上升到 10 并且您拥有整个字母表怎么办?我收到此错误: ValueError: too many values to unpack (expected 2) @jezrael
  • @nielsen - 那么这里的逻辑是什么?你需要对它们进行分类吗?
  • 我在处理数据时看不到数字,但它在呈现时提供了更好的概览。
  • @nielsen - 数字总是最后一个值?
【解决方案2】:

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

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

【讨论】:

  • 这适用于手头的数据。这是一个非常好的解决方案。我一直意识到我的mwe不够好。字母 A、B、C、D、E.. 代表我的数据中较长的名称,并且该解决方案似乎不起作用。但我会给它一个“已解决”的问题,因为它可以在这里工作。
猜你喜欢
  • 1970-01-01
  • 2020-01-13
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 2019-04-30
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多