Inti masalah:
>>> df
RP/Rsum P.value
ID
A_23_P42353 17.8 0
A_23_P369994 15.91 0
A_33_P3262440 436.7 0.0005
A_32_P199429 18.97 0
A_23_P256724 22.24 0
A_33_P3394689 24.24 0
A_33_P3403117 27.14 0
A_24_P252364 28.56 0
A_23_P99515 31.82 0
A_24_P261750 31.46 0
>>> df.dtypes
RP/Rsum float64
P.value float64
>>> ids = pandas.Series(['51513', '9201', np.nan, np.nan, '8794', '6530', '7025', '4897', '84935', '11081'])
>>> df["test"] = ids
>>> df
RP/Rsum P.value test
ID
A_23_P42353 17.8 0 NaN
A_23_P369994 15.91 0 NaN
A_33_P3262440 436.7 0.0005 NaN
A_32_P199429 18.97 0 NaN
A_23_P256724 22.24 0 NaN
A_33_P3394689 24.24 0 NaN
A_33_P3403117 27.14 0 NaN
A_24_P252364 28.56 0 NaN
A_23_P99515 31.82 0 NaN
A_24_P261750 31.46 0 NaN
>>> df.dtypes
RP/Rsum float64
P.value float64
test object
Hal ini juga terjadi pada objek float dan sejenisnya. Saya tidak yakin apa pemicunya.
Saya ingin tahu apakah ini terkait dengan masalah ini yang saya temukan juga pagi ini:
>>> df = pandas.DataFrame(index=[1,2,3,4])
>>> df["test"] = pandas.Series(["B", "fdf", "344", np.nan])
>>> df["test2"] = ["B", "fdf", "344", np.nan]
>>> df test test2
1 fdf B
2 344 fdf
3 NaN 344
4 NaN nan
Sepertinya semacam kesalahan satu per satu bagi saya.
Penggalian lebih lanjut mengarah ke panggilan ke Series.reindex
saat mengatur item sebagai pelakunya:
>>> data
0 B
1 fdf
2 344
3 NaN
>>> df.index = ["A", "B", "C", "D"]
>>> data.reindex(df.index).values
array([nan, nan, nan, nan], dtype=object)
Lebih banyak penggalian mengarah ke reindex
dalam atribut indeks yang dipanggil yang memberikan hasil yang aneh:
>>> data.index.reindex(df.index)
(Index([A, B, C, D], dtype=object), array([-1, -1, -1, -1], dtype=int32))
-1 ini kemudian diterjemahkan ke NaNs.
Judul bug yang diperbarui dengan deskripsi yang lebih benar.
Seri diberikan indeks implisit 0, ..., N-1 ketika Anda tidak menyediakannya-- jadi inilah perilaku yang saya harapkan. Jika data
adalah ndarray mentah atau daftar, maka ini tidak akan terjadi. Jadi fakta bahwa ketika Anda melakukannya:
df[col] = series
dan itu sesuai dengan seri persis dengan indeks df
, itu fitur dan bukan bug :) jadi
df['test'] = ids.values
akan bekerja dengan baik dalam contoh Anda
Dalam hal ini mungkin harus didokumentasikan di suatu tempat jika belum. Sementara itu saya akan menyesuaikan kode saya sendiri seperti yang Anda sarankan, terima kasih.
http://pandas.sourceforge.net/dsintro.html#column -selection-addition-deletion
When inserting a Series that does not have the same index as the DataFrame, it will be conformed to the DataFrame’s index:
In [180]: df['one_trunc'] = df['one'][:2]
In [181]: df
Out[181]:
one flag foo one_trunc
a 1 False bar 1
b 2 False bar 2
c 3 True bar NaN
d NaN False bar NaN
You can insert raw ndarrays but their length must match the length of the DataFrame’s index.
Apa ide di balik fakta bahwa ketika memasukkan Seri yang tidak memiliki indeks yang sama dengan DataFrame, itu akan sesuai dengan indeks DataFrame?
Saat membuat DataFrame dari seri, indeks yang dihasilkan mencakup semua indeks seri individual. Jadi mengapa ide ini tidak digunakan ketika df['new_column'] = series?
Jadi Anda mencoba menambahkan data, tetapi mengabaikan semua nilai yang tidak cocok dengan indeks DataFrame?
Jika _index extension_ akan ada, seseorang selalu dapat melakukan df['new_column'] = series.reindex(df.index) ketika seseorang tidak ingin memperpanjang indeks (perilaku saat ini)?
In [256]: df = pandas.DataFrame({'A': pandas.Series(['foo', 'bar'], index=['a', 'b']),
.....: 'B': pandas.Series([10, 20], index=['b', 'c'])})
In [257]: df
Out[257]:
A B
a foo NaN
b bar 10.000
c NaN 20.000
In [258]: df['C'] = pandas.Series(range(3), index=['a', 'c', 'd'])
In [259]: df
Out[259]:
A B C
a foo NaN 0.000
b bar 10.000 NaN
c NaN 20.000 1.000
Dalam contoh di atas saya mengharapkan baris 'd' di DataFrame.
Yah, saya pikir ide dasarnya adalah bahwa DataFrame adalah "wadah Seri seperti dict dengan panjang tetap". Saat Anda membuat DataFrame dengan dict of Series tanpa indeks eksplisit, tidak ada indeks yang jelas selain penyatuan semuanya.
Saya dapat melihat argumen untuk memperluas indeks secara implisit, tetapi ada pengorbanannya
Komentar yang paling membantu
Seri diberikan indeks implisit 0, ..., N-1 ketika Anda tidak menyediakannya-- jadi inilah perilaku yang saya harapkan. Jika
data
adalah ndarray mentah atau daftar, maka ini tidak akan terjadi. Jadi fakta bahwa ketika Anda melakukannya:df[col] = series
dan itu sesuai dengan seri persis dengan indeks
df
, itu fitur dan bukan bug :) jadidf['test'] = ids.values
akan bekerja dengan baik dalam contoh Anda