Saya memiliki kumpulan data seperti ini. Dataset sebenarnya jauh lebih besar.

data1 = pd.DataFrame({'Name':["Tom","Andy","Joseph","Joe","Mary","Alexa","Chris","Jessica","Jimmy","Andrea","George","Bruce","Will","Eric","Leonard","Ryan","Megan","Michael","Sara"],\
                  "City":["NY","DC","LAX","NY","DC","DC","SF","SD","NY","SF","SD","DC","LAX","SF","LAX","NY","SF","PDX","FL"],\
                  'Car':["Ford","Ford","TOYOTA","GM","GM","Honda","GM","Porsche","Tesla","TOYOTA","Tesla","Tesla","Honda","GM","Nissan","Porsche","Nissan","Ford","Tesla"]})

Pertama, saya ingin menghitung frekuensi sebenarnya dari kombinasi "Kota" dan "Mobil" dan melakukan ini.

df_City_Car_actual=data1.groupby(["City","Car"]).size()
df_City_Car_actual

Lalu saya ingin menghitung frekuensi yang diharapkan dari kombinasi "Kota" dan "Mobil". Jadi saya melakukan ini dulu.

df_City=data1.groupby("City").size()
df_City
df_Car=data1.groupby("Car").size()
df_Car

Kemudian saya ingin mengalikan df_City dan df_Car dan menunjukkan frekuensi yang diharapkan dari City x Car. Misalnya, frekuensi "DC" adalah 4 di df_City dan frekuensi "Ford" adalah 3 di df_Car. Oleh karena itu, frekuensi yang diharapkan DC x Ford adalah 4x3=12.

Saya mencoba ini tetapi tidak berhasil

df_City_Car_expected=df_City*df_Car
df_City_Car_expected

Terakhir, saya ingin membagi df_City_Car_actual dengan df_City_Car_expected sehingga data akhir akan dinormalisasi. Apakah ada cara yang baik untuk melakukan ini? Terima kasih atas bantuan Anda.

0
Tom_Hanks 20 November 2020, 19:13

1 menjawab

Jawaban Terbaik

Cara paling sederhana yang dapat saya pikirkan adalah dengan menggunakan fungsi numpy "produk luar", seperti:

pd.DataFrame(np.outer(df_City.values, df_Car.values), index=df_City.index, columns=df_Car.index)

Yang memberikan:

Car   Ford  GM  Honda  Nissan  Porsche  TOYOTA  Tesla
City                                                 
DC      12  16      8       8        8       8     16
FL       3   4      2       2        2       2      4
LAX      9  12      6       6        6       6     12
NY      12  16      8       8        8       8     16
PDX      3   4      2       2        2       2      4
SD       6   8      4       4        4       4      8
SF      12  16      8       8        8       8     16
2
Robby the Belgian 20 November 2020, 16:20