Pandas DataFrame df terlihat seperti -

fileName     objectsIdentified
file_01.jpg  1, 2, 3
file_02.jpg  2, 3
file_03.jpg  1, 2, 4, 2

Saya ingin memetakan sesuai dict berikut di kolom baru objectName:
d = {1:'obj1', 2:'obj2', 3:'obj3', 4:'obj4'}

Apa yang saya lakukan? Saya menulis fungsi seperti

def conv(ls):
    global d
    return [d[x] for x in ls]

Lalu aku melakukannya df['objectName'] = df['objectsIdentified'].apply(lambda x: conv(x))

Keluaran yang diterima:

fileName     objectsIdentified  objectName  
file_01.jpg  1, 2, 3            obj1, obj2, obj3  
file_02.jpg  2, 3               obj2, obj3  
file_03.jpg  1, 2, 4, 2         obj1, obj2, obj4, obj2

Pertanyaan - Apakah ada cara untuk mencapai hasil yang sama tanpa harus mendefinisikan fungsi kita sendiri?

1
loki 9 Januari 2020, 08:54

2 jawaban

Jawaban Terbaik

Solusi pemahaman daftar - untuk setiap nilai objectsIdentified pemisahan pertama, lalu petakan nilai yang dikonversi ke bilangan bulat di generator dan join terakhir:

df['objectName']=[', '.join(d[int(y)] for y in x.split(', ')) for x in df['objectsIdentified']]
print (df)
      fileName objectsIdentified              objectName
0  file_01.jpg           1, 2, 3        obj1, obj2, obj3
1  file_02.jpg              2, 3              obj2, obj3
2  file_03.jpg        1, 2, 4, 2  obj1, obj2, obj4, obj2

Solusi Panda - buat Series dengan Series.str.split dan DataFrame.stack, konversi ke bilangan bulat, Series.map dan penggunaan terakhir bergabung per grup:

df['objectName'] = (df['objectsIdentified'].str.split(', ', expand=True)
                                           .stack()
                                           .astype(int)
                                           .map(d)
                                           .groupby(level=0)
                                           .apply(', '.join))
2
jezrael 9 Januari 2020, 06:21

Dalam hal ini, saya pikir Anda lebih baik menggunakan pemahaman daftar dengan str.split dan str.join

df['objectName'] = [', '.join(map(lambda y: d[int(y)], x.split(','))) 
                                                  for x in df.objectsIdentified]

Out[536]:
      fileName objectsIdentified        objectName
0  file_01.jpg           1, 2, 3  obj1, obj2, obj3
1  file_02.jpg              2, 3        obj2, obj3
2  file_03.jpg           1, 2, 4  obj1, obj2, obj4
1
Andy L. 9 Januari 2020, 06:08