Bagaimana (dengan menerapkan) memilih dan menyalin kolom tertentu dalam Dataframe menurut indeks atau kolom lain

Saya sudah menanyakan pertanyaan saya tetapi deskripsinya kurang akurat. Orang-orang pintar di forum ini sudah mengusulkan solusi, tapi saya lupa (maaf) secara tepat bahwa jika ada angka nol di kolom yang relevan, maka angka tersebut harus dipertahankan.

Halo Saya memiliki kerangka data seperti di bawah ini

              2014  2015  2016  2017  2018  2019  

         2014   10    20    30    40    0      5
         2015   0     0    200    0    100     0       
         2016   0     0    200   140    35    10       
         2017   0     0     0     20     0    12       

Saya perlu mendapatkan hasil seperti ini:

    yearStart  yearStart+1  yearStart+2  yearStart+3  yearStart+4  
0      10          20            30          40          0
1      0          200             0          100         0       
2     200         140            35          10          0
3      20          0             12           0          0

Idenya adalah untuk memilih di setiap baris, kolom di antara dua tanggal:

indeks dan indeks +delta,dengan delta sebagai parameter (dalam contoh ini 4) untuk menempatkannya dalam kerangka data.

Dengan iterrows(), dibutuhkan terlalu banyak waktu.

Saya mencoba dengan

 df1 = df.apply(lambda x: pd.Series(x[x.keys()>=x.index],1)).fillna(0).astype(int)

tapi itu tidak berhasil:

TypeError: ('Index(...) must be called with a collection of some kind,
1 was passed', 'occurred at index 2014')

Terima kasih


person phil    schedule 19.09.2017    source sumber
comment
Kemungkinan duplikat kerangka data panda: cara menyalin beberapa kolom ke kolom lain sesuai dengan nilai di baris   -  person GPhilo    schedule 19.09.2017
comment
Anda harus mengedit pertanyaan pertama untuk memperjelas kebutuhan Anda, bukan membuka pertanyaan baru yang pada dasarnya identik dengan pertanyaan pertama.   -  person GPhilo    schedule 19.09.2017
comment
maaf tapi saya pemula di forum ini. Saya minta maaf atas kecanggungan saya. Pokoknya terima kasih. Fakta bahwa beberapa angka nol harus dipertahankan memberi saya alasan untuk berpikir bahwa ini adalah kasus yang berbeda.   -  person phil    schedule 19.09.2017


Jawaban (1)


Salah satu caranya adalah

In [1010]: def yearmove(x):
      ...:     idx = x.index.astype(int)
      ...:     idx = idx - x.name
      ...:     mask = idx >= 0
      ...:     idx = 'yearStart' + idx.astype(str)
      ...:     return pd.Series(x.values[mask], index=idx[mask])
      ...:

In [1011]: df.apply(yearmove, 1).fillna(0).astype(int)
Out[1011]:
      yearStart0  yearStart1  yearStart2  yearStart3  yearStart4  yearStart5
2014          10          20          30          40           0           5
2015           0         200           0         100           0           0
2016         200         140          35          10           0           0
2017          20           0          12           0           0           0
person Zero    schedule 19.09.2017
comment
Terima kasih. itu bekerja dengan sempurna. Jika saya perlu memiliki kondisi pada durasi jendela waktu, saya menulis mask=(idx›=0 dan idx‹=delta) tetapi menjawab ValueError: ('Nilai kebenaran dari array dengan lebih dari satu elemen bersifat ambigu. Gunakan a.any() atau a.all()', 'terjadi pada indeks 2015') - person phil; 19.09.2017
comment
Saya menyadari kesalahan saya :'dan' bukannya '&' tetapi ada kesalahan ketik antara 'int' dan 'int64' dengan operator '&'...Saya melacaknya - person phil; 19.09.2017