Saya menemukan perilaku tak terduga ini menggunakan panda yang saya tidak tahu bagaimana menjelaskannya, dan belum menemukan pertanyaan terkait di sini di SO.

Saat membuat kerangka data dari kamus daftar, seperti yang diharapkan, kami mendapatkan setiap elemen dari iterable ke dalam baris baru di kolom yang ditentukan oleh key yang diberikan:

pd.DataFrame({'a':[1,2,3]})

   a
0  1
1  2
2  3

Namun, mencoba melakukan hal yang sama dengan set, menghasilkan:

pd.DataFrame({'a':{1,2,3}})

       a
0  {1, 2, 3}
1  {1, 2, 3}
2  {1, 2, 3}

Jadi tampaknya himpunan itu direplikasi hingga jumlah elemen yang sebenarnya dikandungnya, yaitu 3.

Saya tahu tidak masuk akal untuk menggunakan satu set untuk ini, karena set menurut definisi adalah koleksi tidak berurutan. Namun saya tidak dapat menemukan referensi atau penjelasan di balik perilaku ini. Apakah ini ditentukan di suatu tempat di dokumen? Apakah ada alasan yang jelas di balik ini bahwa saya hilang?

pd.__version__
# '1.0.0'
4
yatu 9 Maret 2020, 17:54

1 menjawab

Jawaban Terbaik

Masalahnya ada di extract_index, dan juga agak sanitize_array. Untuk memberikan panduan lengkap:

import pandas as pd
from pandas.core.internals.construction import init_dict

#pd.DataFrame({'a':{1,2,3}})
data = {'a': {1,2,3}}
index = None
columns = None
dtype = None

Konstruksi dari dict akan melalui blok ini

elif isinstance(data, dict):
    mgr = init_dict(data, index, columns, dtype=dtype)

Dan Anda dapat melihat indeksnya salah:

BlockManager
Items: Index(['a'], dtype='object')
Axis 1: RangeIndex(start=0, stop=4, step=1)
ObjectBlock: slice(0, 1, 1), 1 x 4, dtype: object

Ini terjadi karena init_dict melakukan ini, yang meneruskan arrays=[{1, 2, 3}] ke extract_index dan panda menganggap himpunan sebagai list_like. Ini berarti dibutuhkan panjang dari set ini sebagai panjang Indeks Anda.

from pandas.core.dtypes.common import is_list_like

is_list_like({1,2,3})
#True

Masalah lainnya adalah karena perbedaan ndim dari larik yang menyimpan daftar atau kumpulan, sehingga np.array yang mendasarinya dibuat secara berbeda. Ini cukup terkubur di sini

np.array({1,2,3}).ndim
#0

np.array([1,2,3]).ndim
#1

Jadi, himpunan tersebut diperlakukan sebagai "skalar" yang disiarkan ke seluruh RangeIndex yang ditentukan di atas menjadi array([{1, 2, 3}, {1, 2, 3}, {1, 2, 3}], dtype=object), sedangkan daftarnya tetap sebagai array([1, 2, 3])


Karena memiliki masalah saat mengekstrak indeks, solusi sederhananya adalah menentukan indeks sehingga tidak melewati salah satu dari itu.

pd.DataFrame({'a': {1,2,3}}, index=[0])
#           a
#0  {1, 2, 3}
3
ALollz 9 Maret 2020, 17:50