Jadi dataset saya memiliki beberapa informasi berdasarkan lokasi untuk n tanggal. Masalahnya adalah setiap tanggal sebenarnya adalah tajuk kolom yang berbeda. Misalnya tampilan CSV
location name Jan-2010 Feb-2010 March-2010
A "test" 12 20 30
B "foo" 18 20 25
Yang saya inginkan adalah tampilannya
location name Date Value
A "test" Jan-2010 12
A "test" Feb-2010 20
A "test" March-2010 30
B "foo" Jan-2010 18
B "foo" Feb-2010 20
B "foo" March-2010 25
Masalahnya adalah saya tidak tahu berapa banyak tanggal di kolom (meskipun saya tahu mereka akan selalu dimulai setelah nama)
Jawaban:
UPDATE
Dari v0.20,
melt
adalah fungsi urutan pertama, yang sekarang dapat Anda gunakanVERSI LAMA (ER): <0.20
Anda dapat menggunakan
pd.melt
untuk mendapatkan hasil maksimal, lalu mengurutkan:(Mungkin ingin memasukkan
.reset_index(drop=True)
, hanya agar hasilnya tetap bersih.)Catatan :
pd.DataFrame.sort
sudah tidak digunakan lagi karena mendukungpd.DataFrame.sort_values
.sumber
df2
[kembali] menjadidf
pandas.pivot_table(df2,values='Value',index=['location','name'],columns='Date').reset_index()
.Gunakan
set_index
denganstack
untukMultiIndex Series
, lalu untukDataFrame
ditambahkanreset_index
denganrename
:sumber
Saya rasa saya menemukan solusi yang lebih sederhana
Concat utuh
temp1
dengantemp2
kolomname
Anda sekarang memiliki apa yang Anda minta.
sumber
pd.wide_to_long
Anda dapat menambahkan awalan ke kolom tahun Anda dan kemudian memberi makan langsung ke
pd.wide_to_long
. Saya tidak akan menganggap ini efisien , tetapi mungkin dalam situasi tertentu lebih nyaman daripadapd.melt
, misalnya ketika kolom Anda sudah memiliki awalan yang sesuai.sumber