获取熊猫数据框中多列排列的唯一出现

问题描述 投票:0回答:2

我有一个包含多列的熊猫数据框,其中两列可能包含置换数据(

SOMMET_1
,下例中的
SOMMET_2
)。

数据帧的样本是:

df = pd.DataFrame([[2017, 'MTEZ5P71', 'MTEZIP71', 0.395508, 5.078320],
                   [2017, 'MTEZ5P71', 'RUEYRP71', 0.395508, 5.078320],
                   [2022, 'MTEZ5P71', 'RUEYRP71', 0.006328, 25.435898],     
                   [2022, 'RUEYRP71', 'MTEZ5P71', 0.006328, 25.435898],
                   [2022, 'ARGIAP71', '.HERN 71', 1.180195, 12.507539]],
                  columns=['YEAR', 'SOMMET_1', 'SOMMET_2', 'R', 'X']) 
SOMMET_1 SOMMET_2 R X
2017 MTEZ5P71 MTEZIP71 0.395508 5.078320
2017 MTEZ5P71 RUEYRP71 0.395508 5.078320
2022 MTEZ5P71 RUEYRP71 0.006328 25.435898
2022 RUEYRP71 MTEZ5P71 0.006328 25.435898
2022 ARGIAP71 .赫恩 71 1.180195 12.507539

对于

YEAR
中的每个值,我试图只获取在两列[
SOMMET_1
SOMMET_2
]中数据的无序排列唯一出现的行。理想情况下按字母顺序从列
SOMMET_1
.

对于给定的SOMMET_1,预期结果应为原始数据框

ONLY
具有独特的
SOMMET_2
YEAR
对。对于上面的示例,数据框不应包含第四行:

SOMMET_1 SOMMET_2 R X
2017 MTEZ5P71 MTEZIP71 0.395508 5.078320
2017 MTEZ5P71 RUEYRP71 0.395508 5.078320
2022 MTEZ5P71 RUEYRP71 0.006328 25.435898
2022 ARGIAP71 .赫恩 71 1.180195 12.507539

我尝试过使用

groupby
方法。

df.groupby(['SOMMET_1', 'SOMMET_2'])['YEAR']

但不保证

SOMMET_2
下的子组在
SOMMET_1
子组中不重复。

python pandas unique permutation
2个回答
0
投票

你可以这样做。找到独特的对,然后分组:

def get_unique_pairs(df):
    unique_pairs = set(tuple(sorted([row.SOMMET_1, row.SOMMET_2])) for _, row in df.iterrows())
    return df[df.apply(lambda row: tuple(sorted([row.SOMMET_1, row.SOMMET_2])) in unique_pairs, axis=1)]

result = df.groupby('YEAR').apply(get_unique_pairs).reset_index(drop=True)
print(result)

这给

  YEAR  SOMMET_1  SOMMET_2         R          X
0  2017  MTEZ5P71  MTEZIP71  0.395508   5.078320
1  2017  MTEZ5P71  RUEYRP71  0.395508   5.078320
2  2022  MTEZ5P71  RUEYRP71  0.006328  25.435898
3  2022  RUEYRP71  MTEZ5P71  0.006328  25.435898
4  2022  ARGIAP71  .HERN 71  1.180195  12.507539


0
投票

你可以

sort
之前
drop_duplicates

import numpy as np

cols = ['SOMMET_1', 'SOMMET_2']
df[cols] = np.sort(df[cols])

out = df.drop_duplicates(subset=['YEAR']+cols)

注意。这会改变原始

df
,如果您不想,请先复制
tmp = df.copy()
并使用
tmp
代替
df

输出:

   YEAR  SOMMET_1  SOMMET_2         R          X
0  2017  MTEZ5P71  MTEZIP71  0.395508   5.078320
1  2017  MTEZ5P71  RUEYRP71  0.395508   5.078320
2  2022  MTEZ5P71  RUEYRP71  0.006328  25.435898
4  2022  .HERN 71  ARGIAP71  1.180195  12.507539
© www.soinside.com 2019 - 2024. All rights reserved.