gpt4 book ai didi

python - 将类似功能应用于多级 Pandas 数据框

转载 作者:太空宇宙 更新时间:2023-11-03 15:03:08 25 4
gpt4 key购买 nike

我有以下形式的多级数据框:

df = pd.DataFrame([[1,'A',2,'B',1,'B'],[2,'B',2,'B',2,'A'],[1,'A',1,'A',1,'A'],[1,'B',2,'A',2,'B']],
columns=pd.MultiIndex.from_tuples([('S1','Num'),('S1','Let'),('S2','Num'),('S2','Let'),('S3','Num'),('S3','Let')]))

S1 S2 S3
Num Let Num Let Num Let
0 1 A 2 B 1 B
1 2 B 2 B 2 A
2 1 A 1 A 1 A
3 1 B 2 A 2 B

我如何创建一个新的数据框,以便选择每个级别零列,如果 Let=='B' 那么它设置 Num = 3?基本上我想获得以下数据框:

   S1      S2      S3    
Num Let Num Let Num Let
0 1 A 3 B 3 B
1 3 B 3 B 2 A
2 1 A 1 A 1 A
3 3 B 2 A 3 B

最佳答案

一种方法是按位置工作并使用 ilocwhere:

>>> df.iloc[:,0::2] = df.iloc[:,0::2].where((df.iloc[:,1::2]!="B").values, 3)
>>> df
S1 S2 S3
Num Let Num Let Num Let
0 1 A 3 B 3 B
1 3 B 3 B 2 A
2 1 A 1 A 1 A
3 3 B 2 A 3 B

这使用数组

>>> (df.iloc[:,1::2]!="B").values
array([[ True, False, False],
[False, False, True],
[ True, True, True],
[False, True, False]], dtype=bool)

决定我们需要在什么地方保留原始值。我们必须将 .values 粘贴在那里,否则 pandas 会尝试对齐框架,而我们是手动进行的。

如果您坚持不使用 iloc,那么事情会变得有点棘手。一种方法是使用 xsupdate:

>>> df.update(df.xs("Num", level=1, axis=1, drop_level=False).where(
df.xs("Let", level=1, axis=1, drop_level=False).values != "B", 3))
>>> df
S1 S2 S3
Num Let Num Let Num Let
0 1 A 3 B 3 B
1 3 B 3 B 2 A
2 1 A 1 A 1 A
3 3 B 2 A 3 B

或者如果您的列是词法排序的,您可以将 locslice(None) 一起使用:

>>> df = df.sort_index(axis=1)
>>> nummask = slice(None), "Num"
>>> letmask = slice(None), "Let"
>>> df.loc[:, nummask] = df.loc[:, nummask].where((df.loc[:, letmask] != "B").values, 3)
>>> df
S1 S2 S3
Let Num Let Num Let Num
0 A 1 B 3 B 3
1 B 3 B 3 A 2
2 A 1 A 1 A 1
3 B 3 A 2 B 3

这可以使用 IndexSlice 进行一些简化:

>>> df = df.sort_index(axis=1)
>>> idx = pd.IndexSlice
>>> df.loc[:,idx[:,"Num"]] = df.loc[:,idx[:,"Num"]].where((df.loc[:,idx[:,"Let"]] != "B").values, 3)
>>> df
S1 S2 S3
Let Num Let Num Let Num
0 A 1 B 3 B 3
1 B 3 B 3 A 2
2 A 1 A 1 A 1
3 B 3 A 2 B 3

关于python - 将类似功能应用于多级 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35639794/

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