gpt4 book ai didi

python - 使多索引 Pandas 数据框成为非对称的

转载 作者:行者123 更新时间:2023-12-01 06:35:47 27 4
gpt4 key购买 nike

我有一个多索引数据框,大致如下所示:

import pandas as pd

test = pd.DataFrame({('A', 'a'):[1,2,3,4,5], ('A', 'b'):[5,4,3,2,1], ('B', 'a'):[5,2,3,4,1], ('B','b'):[1,4,3,2,5]})
>>> Output

A B
a b a b
0 1 5 5 1
1 2 4 2 4
2 3 3 3 3
3 4 2 4 2
4 5 1 1 5

在此数据帧中,第零行和第五行是对称的,因为如果翻转第零行的整个 AB 列,它变得与第五个相同。同样,第二行与其自身对称。

我计划从原始数据框中删除这些行,从而使其成为“非对称”。具体方案如下:

  1. 如果索引较高的行与索引较低的行对称,则保留较低的行并删除较高的行。例如,在上面的数据框中,保留第零行并删除第五行。
  2. 如果一行与其自身对称,则删除该行。例如,从上面的数据框中删除第二行。

我的尝试是首先将四个列表压缩到一个元组列表中,通过简单的 if 语句删除对称元组,解压缩它们,然后将它们合并回数据帧中。然而,事实证明这是低效的,使得它无法扩展到大型数据帧。

如何才能有效地实现这一目标?我想利用几个内置的 pandas 方法是必要的,但看起来相当复杂。

最佳答案

不死,

尝试这个解决方案:

import pandas as pd
test = pd.DataFrame({('A', 'a'):[1,2,3,4,5], ('A', 'b'):[5,4,3,2,1], ('B', 'a'):[5,2,3,4,1], ('B','b'):[1,4,3,2,5]})

test['idx'] = test.index * 2 # adding auxiliary column 'idx' (all even)

test2 = test.iloc[:, [2,3,0,1,4]] # creating flipped DF
test2.columns = test.columns # fixing column names
test2['idx'] = test2.index * 2 + 1 # for flipped DF column 'idx' is all odd

df = pd.concat([test, test2])
df = df.sort_values (by='idx')
df = df.set_index('idx')
print(df)

A B
a b a b
idx
0 1 5 5 1
1 5 1 1 5
2 2 4 2 4
3 2 4 2 4
4 3 3 3 3
5 3 3 3 3
6 4 2 4 2
7 4 2 4 2
8 5 1 1 5
9 1 5 5 1

df = df.drop_duplicates() # remove rows with duplicates
df = df[df.index%2 == 0] # remove rows with odd idx (flipped)
df = df.reset_index()[['A', 'B']]
print(df)

A B
a b a b
0 1 5 5 1
1 2 4 2 4
2 3 3 3 3
3 4 2 4 2

这个想法是创建具有奇数索引的翻转行,以便在重新索引后将它们放置在原始行下方。然后删除重复项,保留索引较低的行。对于清理,只需删除具有奇数索引的剩余行。

请注意,[3,3,3,3] 行仍保留。应该有一个单独的过滤器来处理自对称行。由于您对自对称的定义不清楚(其他行也有一定程度的对称性),所以我将这部分留给您。应该很简单。

关于python - 使多索引 Pandas 数据框成为非对称的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59676085/

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