У меня есть следующий фреймворк pandas: индекс so_id 10 390 10 395 10 405 11 390 11 395 11 405 12 390 12 395 12 405 Желаемый результат будет следующим: индекс so_id 10 390 11 395 12 ...

2
Javier Monsalve 5 Апр 2021 в 23:13

2 ответа

Лучший ответ

Мы можем это сделать, но, что важно, обратите внимание на комментарий выше.

df=df.sort_values (by=['so_id'])#Sort df

Создайте временный столбец t, который представляет собой классификацию so_id и resort df обратно к исходному df=df.assign(t=df['so_id'].ne(df['so_id'].shift(1)).cumsum()).sort_values(by='index')

Создать временную классификацию индекса

df=df.assign(t1=df['index'].ne(df['index'].shift(1)).cumsum())

Выберите, где два вышеуказанных класса похожи

df=df[df['t']==df['t1']].drop(columns=['t','t1'])

print(df)

    index  so_id
0     10    390
4     11    395
8     12    405
1
wwnde 5 Апр 2021 в 20:49

Здесь я создал словарь, который сопоставляет старый индекс с новым индексом, добавляя значения в набор для получения уникальных значений, а затем выполняя сортировку в требуемом порядке возрастания. После того, как словарь сформирован, мы можем проверить, совпадают ли значения в определенной строке с данными внутри словаря, если она совпадает, то эта комбинация верна, и мы ничего не делаем с этой строкой, если она не совпадает, мы просто отбрасываем эта строка:

import pandas as pd
df = pd.DataFrame([[10, 390], [10, 395], [10, 405], [11, 390], [11, 395], [11, 405], [12, 390], [12, 395], [12, 405]], columns=['id', 'so_id'])
idx_map = {}
idx=set()
new_idx=set()
for row in df.iterrows():
    idx.add(row[1]['id'])
    new_idx.add(row[1]['so_id'])

for i in range(len(idx)):
    idx_map[sorted(idx)[i]]=sorted(new_idx)[i]


for idx, row in df.iterrows():
    if idx_map[row[0]]==row[1]:
        continue
    else:
        df = df.drop(idx)

print(df)

Вывод

   id  so_id
0  10    390
4  11    395
8  12    405

Здесь словарь idx_map выглядит так:

{10: 390, 11: 395, 12: 405}
1
Cute Panda 5 Апр 2021 в 20:47