我有一个包含多列的熊猫数据框,其中两列可能包含置换数据(
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
子组中不重复。
你可以这样做。找到独特的对,然后分组:
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
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