gpt4 book ai didi

python - 在多级列 Pandas 数据框中创建列的更好方法

转载 作者:行者123 更新时间:2023-12-04 14:08:25 27 4
gpt4 key购买 nike

假设我有一个 Pandas 多级列数据框 df像这样:

  | A     |  B     -> first level
---------------------------------
| x y | x y -> second level
---------------------------------
0| 5 5 | 1 5
1| 3 1 | 4 7
2| 1 4 | 10 20
3| 50 8 | 7 8
如何为每个级别创建一个具有 x 和 y 差异的新列?
我知道我可以一一做,像这样:
df["A"]["diff"] = df["A"].x - df["A"].y
df["B"]["diff"] = df["B"].x - df["B"].y
最终输出将是:
  | A          |  B            -> first level
-----------------------------------------------
| x y diff | x y diff -> second level
-----------------------------------------------
0| 5 5 0 | 1 5 -4
1| 3 1 2 | 4 7 -3
2| 1 4 -3 | 10 20 -10
3| 50 8 42 | 7 8 -1
是否有一行操作可以一次为所有级别应用此列创建?
我的解决方案似乎非常重复,在我的情况下,我可能在第一级有几个(超过 10 个标签)。
有更好的方法吗?

最佳答案

示例 df:

df = pd.DataFrame(data=[[1,2,3,4,5,6,1,2,3], [7,8,9,10,11,12,7,8,9], [13,14,15,16,17,18,4,5,6]], index=pd.date_range('2004-01-01', '2004-01-03'))
df.columns = pd.MultiIndex.from_product([['x', 'y', 'z'], list('abc')])
df:



X



z



一种

C
一种

C
一种

C

2004-01-01
1
2
3
4
5
6
1
2
3

2004-01-02
7
8
9
10
11
12
7
8
9

2004-01-03
13
14
15
16
17
18
4
5
6

df1 = df.sum(level=0, axis=1)
df1.columns = pd.MultiIndex.from_product([df1.columns,["sum"]])
df1 = pd.concat([df,df1],axis=1).sort_index(1)

df1:



X



z




一种

C

一种

C

一种

C


2004-01-01
1
2
3
6
4
5
6
15
1
2
3
6

2004-01-02
7
8
9
24
10
11
12
33
7
8
9
24

2004-01-03
13
14
15
42
16
17
18
51
4
5
6
15

编辑:
减法:
df2 = df.T.groupby(level=[0]).diff().T.loc[:,df.columns.get_level_values(1).isin(['c'])]
df2 = pd.concat([df,df2.rename(columns={'c':'diff b/w b and c'})],axis=1).sort_index(1)

df2:



X



z




一种

C
差异黑白 b 和 c
一种

C
差异黑白 b 和 c
一种

C
差异黑白 b 和 c

2004-01-01
1
2
3
1.0
4
5
6
1.0
1
2
3
1.0

2004-01-02
7
8
9
1.0
10
11
12
1.0
7
8
9
1.0

2004-01-03
13
14
15
1.0
16
17
18
1.0
4
5
6
1.0

编辑(最终优化):
df2 = (df.T.groupby(level=[0]).diff().T.rename(mapper=lambda x: f'diff_{x}', 
axis='columns',
level=1,
))
df2 = pd.concat([df,df2],axis=1).sort_index(1)

df2:



X







z





一种

C
diff_a
diff_b
diff_c
一种

C
diff_a
diff_b
diff_c
一种

C
diff_a
diff_b
diff_c

2004-01-01
1
2
3
NaN
1.0
1.0
4
5
6
NaN
1.0
1.0
1
2
3
NaN
1.0
1.0

2004-01-02
7
8
9
NaN
1.0
1.0
10
11
12
NaN
1.0
1.0
7
8
9
NaN
1.0
1.0

2004-01-03
13
14
15
NaN
1.0
1.0
16
17
18
NaN
1.0
1.0
4
5
6
NaN
1.0
1.0


正如 Shubham Sharma 所提到的 :)
您可以使用:
for c in df.columns.levels[0]:
df.loc[:, (c, 'diff')] = df[(c, 'b')] - df[(c, 'a')]

df = df.sort_index(level=0, axis=1)

关于python - 在多级列 Pandas 数据框中创建列的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66533883/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com