Pandas: Saat menambahkan Seri ke DataFrame dengan indeks yang berbeda, Seri akan berubah menjadi semua NaNs

Dibuat pada 6 Des 2011  ·  9Komentar  ·  Sumber: pandas-dev/pandas

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.

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 :) jadi

df['test'] = ids.values

akan bekerja dengan baik dalam contoh Anda

Semua 9 komentar

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

Apakah halaman ini membantu?
0 / 5 - 0 peringkat