Saya memiliki kerangka data panda berikut: indeks so_id 10 390 10 395 10 405 11 390 11 395 11 405 12 390 12 395 12 405 Output yang diinginkan adalah sebagai berikut: indeks so_id 10 390 11 395 12 ...

2
Javier Monsalve 5 April 2021, 23:13

2 jawaban

Jawaban Terbaik

Kita bisa melakukannya tetapi yang penting, perhatikan komentar di atas.

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

Buat kolom sementara t yang merupakan klasifikasi so_id dan resort df kembali ke semula df=df.assign(t=df['so_id'].ne(df['so_id'].shift(1)).cumsum()).sort_values(by='index')

Buat klasifikasi indeks sementara

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

Pilih di mana dua kelas di atas serupa

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 April 2021, 20:49

Di sini saya membuat kamus yang memetakan indeks lama ke indeks baru dengan menambahkan nilai ke satu set untuk mendapatkan nilai unik dan kemudian mengurutkan dalam urutan menaik yang diperlukan. Setelah kamus terbentuk, kami dapat memeriksa apakah nilai pada baris tertentu cocok dengan data di dalam kamus, jika cocok maka kombinasi itu benar dan kami tidak melakukan apa pun pada baris itu, jika tidak cocok, kami cukup menjatuhkan baris itu:

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)

Keluaran

   id  so_id
0  10    390
4  11    395
8  12    405

Di sini, kamus idx_map terlihat seperti ini:

{10: 390, 11: 395, 12: 405}
1
Cute Panda 5 April 2021, 20:47