Saya memiliki transpose sas proc yang saya coba tiru di panda.

Berikut ini contohnya:

ID = ['ID1', 'ID1', 'ID1', 'ID1', 'ID1']
obs_week = [201701,201701,201701,201701,201701]
weeks_id = [1,2,3,4,5]
spend = [100,200,300,400,500]
df = pd.DataFrame(zip(ID, obs_week, weeks_id, spend ), columns = ['id', 'obs_week', 'weeks_id', 'spend'])
df

Ini memberikan tabel seperti ini:

    id  obs_week    weeks_id    spend
0   ID1 201701      1           100
1   ID1 201701      2           200
2   ID1 201701      3           300
3   ID1 201701      4           400
4   ID1 201701      5           500

Saya mencoba mentranspos ini sehingga ID1 dan obs_week menjadi unik dan kemudianweeks_id menjadi kolom baru dengan awalan.

Kode sas terlihat seperti ini:

proc transpose data=spend out=spend_hh (drop = _label_ _name_) prefix=spend_;
  by id obs_week;
  id weeks_id;
  var spend;
run;

Saya telah berhasil mendekati menggunakan df.pivot_table

df.pivot_table(index=['id','obs_week'], columns='weeks_id', aggfunc=sum, fill_value=0)

Memberi meja seperti ini

                   spend
weeks_id           1    2   3   4   5
id       obs_week                   
ID1      201701    100  200 300 400 500

Masalah saya adalah saya ingin mengganti nama 1 2 3 4 5 menjadi Spend_1, Spend_2, dll

Saya juga ingin melakukan ini untuk beberapa variabel berbeda di dalam file tetapi saya berasumsi saya hanya dapat membatasi pilihan hanya pada bidang yang saya inginkan

Jawaban saya akan terlihat seperti ini:

    id  obs_week    spend_1 spend_2 spend_3 spend_4 spend_5
0   ID1 201701      100     200     300     400     500

Apakah ini hanya meruntuhkan header?

Saya juga ingin id dan obs_week tidak menjadi bagian dari index.

3
TaxiMike 9 Agustus 2017, 19:56

2 jawaban

Jawaban Terbaik

Anda memerlukan pemahaman daftar untuk membuat nama kolom terlebih dahulu lalu reset_index untuk kolom dengan indeks dan rename_axis untuk menghapus teks weeks_id:

df = df.pivot_table(index=['id','obs_week'], columns='weeks_id', aggfunc=sum, fill_value=0)

df.columns = ['{}_{}'.format(x[0], x[1]) for x in df.columns]
df = df.reset_index().rename_axis(None, axis=1)
print (df)
    id  obs_week  spend_1  spend_2  spend_3  spend_4  spend_5
0  ID1    201701      100      200      300      400      500

Atau:

df.columns = ['_'.join((x[0], str(x[1]))) for x in df.columns]
df = df.reset_index().rename_axis(None, axis=1)
print (df)
    id  obs_week  spend_1  spend_2  spend_3  spend_4  spend_5
0  ID1    201701      100      200      300      400      500
2
jezrael 9 Agustus 2017, 17:40

Berikut ini adalah single-liner

In [1446]: (df.pivot_table(index=['id', 'obs_week'], columns=['weeks_id'], values='spend')
              .add_prefix('spend_')
              .reset_index())
Out[1446]:
weeks_id   id  obs_week  spend_1  spend_2  spend_3  spend_4  spend_5
0         ID1    201701      100      200      300      400      500

Atau,

In [1449]: (df.pivot_table(index=['id', 'obs_week'], columns=['weeks_id'], values='spend')
              .add_prefix('spend_')
              .reset_index()
              .rename_axis(None, axis=1))
Out[1449]:
    id  obs_week  spend_1  spend_2  spend_3  spend_4  spend_5
0  ID1    201701      100      200      300      400      500
2
Zero 9 Agustus 2017, 17:18