删除置换多重索引的副本

2024-09-29 21:40:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数据帧,如下所示:

           Correlations       adf
FITB RF        0.984395 -5.484766
WAT  SWK       0.981778 -5.465284
SWK  WAT       0.981778 -5.420976
RF   FITB      0.984395 -5.175268
MCO  BK        0.973801 -4.919812

我想过滤索引,这样数据帧会删除任何重复的值,即使它们被置换。因此,上述数据帧将成为

           Correlations       adf
FITB RF        0.984395 -5.484766
WAT  SWK       0.981778 -5.465284
MCO  BK        0.973801 -4.919812

对于一个大的数据帧,我找不到一个有效的方法。非常感谢您的帮助!你知道吗


Tags: 数据方法bkrfswkadfwatmco
3条回答

您可以使用sorted+duplicated

df[~pd.DataFrame(list(map(sorted,df.index.values))).duplicated().values]
          Correlations       adf
FITB RF       0.984395 -5.484766
WAT  SWK      0.981778 -5.465284
MCO  BK       0.973801 -4.919812

索引可以通过以下函数进行规范化:

def normalizeIndex(x):
    splittedString = list(filter(None, x.split(" ")))#split the input string into token with blank space separator and remove empty results
    splittedString.sort()#sort the token list
    return " ".join(splittedString) #return normalized string concatenating ordered token list

在对索引上的df进行分组并选择第一次出现之前,可以将该函数应用于索引(无论如何,可以应用进一步的分组选项):

    df = pd.DataFrame({'Correlations': [0.984395, 0.981778,0.981778,0.984395,0.973801,],
                   'adf':[-5.484766,-5.465284,-5.420976,-5.175268,-4.919812]},

                  index=['FITB RF','WAT  SWK','SWK  WAT','RF   FITB','MCO  BK',])

    df.index = df.index.map(lambda x: normalizeIndex(x)) #Apply reordering function to df index
    df = df.groupby(df.index).first() #Group the resulting dataframe, by index and, take the first occurence
    print(df)

输出:

         Correlations       adf
BK MCO       0.973801 -4.919812
FITB RF      0.984395 -5.484766
SWK WAT      0.981778 -5.465284

您可以利用np.sort+pd.DataFrame.duplicated

m = pd.DataFrame(np.sort(df.index.tolist(), axis=1)).duplicated()
df[~(m.values)]

          Correlations       adf
FITB RF       0.984395 -5.484766
WAT  SWK      0.981778 -5.465284
MCO  BK       0.973801 -4.919812

或者,以类似的方式,使用pd.MultiIndex.duplicated

m = pd.MultiIndex.from_tuples(
    [tuple(x) for x in np.sort(df.index.tolist(), axis=1)]
).duplicated()
df[~m]


          Correlations       adf
FITB RF       0.984395 -5.484766
WAT  SWK      0.981778 -5.465284
MCO  BK       0.973801 -4.919812

相关问题 更多 >

    热门问题