Saya telah menemukan perilaku di pandas DataFrames yang tidak saya mengerti.

df = pd.DataFrame(np.random.randint(1, 10, (3, 3)), index=['one', 'one', 'two'], columns=['col1', 'col2', 'col3'])
new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'})
df.iloc[0] = new_data
# resulting df looks like:

#       col1    col2    col3
#one    new     new     new
#one    9       6       1
#two    8       3       7

Tetapi jika saya mencoba menambahkan kamus, saya mendapatkan ini:

new_data = {'col1': 'new', 'col2': 'new', 'col3': 'new'}
df.iloc[0] = new_data
#
#         col1  col2    col3
#one      col2  col3    col1
#one      2     1       7
#two      5     8       6

Mengapa ini terjadi? Dalam proses menulis pertanyaan ini, saya menyadari bahwa kemungkinan besar df.loc hanya mengambil kunci dari new_data, yang juga menjelaskan mengapa nilainya rusak. Tapi, sekali lagi, mengapa ini terjadi? Jika saya mencoba membuat DataFrame dari kamus, itu menangani kunci seolah-olah itu adalah kolom:

pd.DataFrame([new_data])

#    col1   col2    col3
#0  new     new     new

Mengapa itu bukan perilaku default di df.loc?

8
J Jones 14 Juli 2016, 22:52

1 menjawab

Jawaban Terbaik

Ini adalah perbedaan antara bagaimana kamus berulang dan bagaimana seri panda diperlakukan.

Seri panda mencocokkan indeksnya dengan kolom saat ditugaskan ke baris dan cocok dengan indeks jika ditugaskan ke kolom. Setelah itu, ia memberikan nilai yang sesuai dengan indeks atau kolom yang cocok itu.

Ketika sebuah objek bukan objek pandas dengan objek indeks yang nyaman untuk dicocokkan, pandas akan mengulangi objek tersebut. Kamus beralih melalui kuncinya dan itulah mengapa Anda melihat kunci kamus di slot baris itu. Kamus tidak diurutkan dan itulah sebabnya Anda melihat kunci yang diacak di baris itu.

7
piRSquared 14 Juli 2016, 23:04