gpt4 book ai didi

python - 在 Pandas 的 DF 中间添加级别

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:28 25 4
gpt4 key购买 nike

我想为我的 DF 添加一个新级别(这样我就可以使用 pd.reindex 做其他事情)。我的 DF 基本上是这样的:

df = pd.DataFrame({('A','a'): [-1,-1,0,10,12],
('A','b'): [0,1,2,3,-1],
('A','c'): [-1,1,0,10,12],
('A','d'): [1,1,2,3,-1],
('B','a'): [-20,-10,0,10,20],
('B','b'): [-200,-100,0,-1,200],
('B','c'): [-20,-10,0,10,20],
('B','d'): [-200,-100,0,100,200]
})

##df
A B
a b c d a b c d
0 -1 0 1 1 -20 -200 -20 -200
1 -1 1 -1 1 -10 -100 -10 -100
2 0 2 0 2 0 0 0 0
3 10 3 10 3 10 -1 10 100
4 12 -1 12 -1 20 200 20 200

我想分配新的关卡键 L1 = a+b, L2= c+d。我该怎么做?

期望的输出是

##df
A B
L1 L2 L1 L2
a b c d a b c d
0 -1 0 1 1 -20 -200 -20 -200
1 -1 1 -1 1 -10 -100 -10 -100
2 0 2 0 2 0 0 0 0
3 10 3 10 3 10 -1 10 100
4 12 -1 12 -1 20 200 20 200

编辑:目标是实现类似于 here 中要求的东西.这意味着某些行将具有相同 KEY 的 NA,具体取决于其他列的值。例如。如果我想通过分别测试列 bd 是否为负数来过滤 ac 列:

##df
A B
L1 L2 L1 L2
a b c d a b c d
0 -1 0 1 1 NA NA NA NA
1 -1 1 -1 1 NA NA NA NA
2 0 2 0 2 0 0 0 0
3 10 3 10 3 NA NA 10 100
4 NA NA NA NA 20 200 20 200

最佳答案

您需要使用map 创建新的array 然后赋值:

d = {'a':'L1','b':'L1','c':'L2','d':'L2'}
a = df.columns.get_level_values(1).map(lambda x: d[x])
print (a)
['L1' 'L1' 'L2' 'L2' 'L1' 'L1' 'L2' 'L2']

df.columns = [df.columns.get_level_values(0),a,df.columns.get_level_values(1)]
#same as
df.columns = pd.MultiIndex.from_arrays([df.columns.get_level_values(0),
df.columns.get_level_values(1).map(lambda x: d[x]),
df.columns.get_level_values(1)])
print (df)
A B
L1 L2 L1 L2
a b c d a b c d
0 -1 0 -1 1 -20 -200 -20 -200
1 -1 1 1 1 -10 -100 -10 -100
2 0 2 0 2 0 0 0 0
3 10 3 10 3 10 -1 10 100
4 12 -1 12 -1 20 200 20 200

第二个输出真的很复杂,对我来说有效:

#filter columns
idx = pd.IndexSlice
mask = df.loc[:, idx[:,:,['b','d']]] < 0
print (mask)
A B
L1 L2 L1 L2
b d b d
0 False False True True
1 False False True True
2 False False False False
3 False False True False
4 True True False False

#create mask to columns a,c
mask1 = mask.reindex(columns=df.columns)
mask1 = mask1.groupby(level=[0,1], axis=1).apply(lambda x: x.bfill(axis=1))
print (mask1)
A B
L1 L2 L1 L2
a b c d a b c d
0 False False False False True True True True
1 False False False False True True True True
2 False False False False False False False False
3 False False False False True True False False
4 True True True True False False False False

print (df.mask(mask1))
A B
L1 L2 L1 L2
a b c d a b c d
0 -1.0 0.0 -1.0 1.0 NaN NaN NaN NaN
1 -1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 0.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0
3 10.0 3.0 10.0 3.0 NaN NaN 10.0 100.0
4 NaN NaN NaN NaN 20.0 200.0 20.0 200.0

另一种使用 reindexmethod='bfill' 的解决方案,但需要双转置(我认为这是错误 - 仅适用于 MultiIndexindex 中,而不是在 columns 中使用 MultiIndex:

idx = pd.IndexSlice
mask = df.loc[:, idx[:,['b','d']]] < 0
print (mask)
A B
b d b d
0 False False True True
1 False False True True
2 False False False False
3 False False True False
4 True True False False

mask1 = mask.T.reindex(df.columns, method='bfill').T
print (mask1)
A B
a b c d a b c d
0 False False False False True True True True
1 False False False False True True True True
2 False False False False False False False False
3 False False False False True True False False
4 True True True True False False False False

print (df.mask(mask1))
A B
a b c d a b c d
0 -1.0 0.0 -1.0 1.0 NaN NaN NaN NaN
1 -1.0 1.0 1.0 1.0 NaN NaN NaN NaN
2 0.0 2.0 0.0 2.0 0.0 0.0 0.0 0.0
3 10.0 3.0 10.0 3.0 NaN NaN 10.0 100.0
4 NaN NaN NaN NaN 20.0 200.0 20.0 200.0

关于python - 在 Pandas 的 DF 中间添加级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42487091/

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