我的示例数据如下所示:
data = {'index': ['001', '002', '003'],
'A' : ['red', 'green', 'blue'],
'B' : ['blue', 'yellow', 'green'],
'C' : ['green', 'blue', 'red'],
'A_new' : [2, 1, 3], 'B_new' : [0, 1, 2], 'C_new' : [0, 0, 1],
'A_old' : [1, 0, 1], 'B_old' : [1, 0, 0], 'C_old' : [0, 0, 2],
'A_other_new' : [2, 0, 1], 'A_other_old' : [1, 1, 0]}
df = pd.DataFrame (data, columns = ['index', 'A', 'B', 'C', 'A_new', 'B_new', 'C_new',
'A_old', 'B_old', 'C_old', 'A_other_new', 'A_other_old'])
df
输出:
index A B C A_new B_new C_new A_old B_old C_old A_other_new A_other_old
0 001 red blue green 2 0 0 1 1 0 2 1
1 002 green yellow blue 1 1 0 0 0 0 0 1
2 003 blue green red 3 2 1 1 0 2 1 0
index color letter other age
00 001 red A no new
01 001 red A no new
02 001 red A no old
03 001 red A yes new
04 001 red A yes new
05 001 red A yes old
06 001 blue B no old
07 001 green C no 0
08 002 green A no new
09 002 green A yes old
10 002 yellow B no new
11 002 blue C no 0
12 003 blue A no new
13 003 blue A no new
14 003 blue A no new
15 003 blue A no old
16 003 blue A yes new
17 003 green B no new
18 003 green B no new
19 003 red C no new
20 003 red C no old
21 003 red C no old
我不确定是否理解所需输出中的other
列,但您可以在这里使用melt
。 如果你能解释其他什么手段会更好:
df = df.melt(id_vars=['index', 'A', 'B', 'C'],
var_name='other')
df['age'] = df['other'].str.split('_').str[1]
df['letter'] = df['other'].str.split('_').str[0]
print(df)
index A B C other value age letter
0 001 red blue green A_new 2 new A
1 002 green yellow blue A_new 1 new A
2 003 blue green red A_new 3 new A
3 001 red blue green B_new 0 new B
4 002 green yellow blue B_new 1 new B
5 003 blue green red B_new 2 new B
6 001 red blue green C_new 0 new C
7 002 green yellow blue C_new 0 new C
8 003 blue green red C_new 1 new C
9 001 red blue green A_old 1 old A
10 002 green yellow blue A_old 0 old A
11 003 blue green red A_old 1 old A
12 001 red blue green B_old 1 old B
13 002 green yellow blue B_old 0 old B
14 003 blue green red B_old 0 old B
15 001 red blue green C_old 0 old C
16 002 green yellow blue C_old 0 old C
17 003 blue green red C_old 2 old C
18 001 red blue green A_other_new 2 other A
19 002 green yellow blue A_other_new 0 other A
20 003 blue green red A_other_new 1 other A
21 001 red blue green A_other_old 1 other A
22 002 green yellow blue A_other_old 1 other A
23 003 blue green red A_other_old 0 other A