从 Python 中的多个列中删除相同的元素
Remove same elements from multiple columns in Python
我正在使用 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]
Returns:
ValueError: too many values to unpack (expected 2)
如果有元组或 MultiIndex
可能使用 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 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
您只需要先删除所有无用的字符,然后拆分和反转字符串即可。
import re
df.columns = [" ".join(reversed(re.sub(r"\)|\(|'|,", "", x).split()))
for x in df.columns]
我正在使用 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]
Returns:
ValueError: too many values to unpack (expected 2)
如果有元组或 MultiIndex
可能使用 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 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
您只需要先删除所有无用的字符,然后拆分和反转字符串即可。
import re
df.columns = [" ".join(reversed(re.sub(r"\)|\(|'|,", "", x).split()))
for x in df.columns]