重塑 DataFrame 是數據科學中一項重要且必不可少的技能。 在本文中,我們將探討 pandas Melt() 以及如何使用它進行數據處理。
最簡單的melt
最簡單的melt()不需要任何參數,它將所有列變成行(顯示為列變量)並在新列值中列出所有關聯值。
df_wide.melt()
這個輸出通常沒有多大意義,所以一般用例至少指定了 id_vars 參數。 例如, id_vars = 'Country' 會告訴 Pandas 將 Country 保留為一列,並將所有其他列轉換為行。
df_wide.melt(
id_vars='Country',
)
現在行數為 15,因為 Country 列中的每個值都有 5 個值(3 X 5 = 15)。
顯示自定義名稱
「變量」和「值」是列名。 我們可以通過 var_name 和 value_name 參數指定自定義名稱:
df_wide.melt(
id_vars='Country',
var_name='Date',
value_name='Cases'
)
指定多個 ID
Melt() 最有用的特性之一是我們可以指定多個 id 以將它們保留為列。 例如,如果我們想保留 Country、Lat 和 Long 作為列以便更好地參考:
df_wide.melt(
id_vars=['Country', 'Lat', 'Long'],
var_name='Date',
value_name='Cases'
)
指定melt的列
Pandas的melt() 函數默認情況下會將所有其他列(除了 id_vars 中指定的列)轉換為行。 在實際項目中可能只關心某些列,例如,如果我們只想查看「24/01/2020」和「25/01/2020」上的值:
df_wide.melt(
id_vars=['Country', 'Lat', 'Long'],
value_vars=["24/01//2020", "25/01//2020"],
var_name='Date',
value_name='Cases'
)
Pandas melt
我們也可以直接從 Pandas 模塊而不是從 DataFrame 調用melt()。 但是,這些是相同的。
重塑 COVID-19 時間序列數據
有了到目前為止我們學到的知識,讓我們來看看一個現實世界的問題:約翰霍普金斯大學 CSSE Github 提供的 COVID-19 時間序列數據。
有兩個問題:
- 確認、死亡和恢復保存在不同的 csv 文件中。 將它們繪製在一張圖中並不簡單。
- 日期顯示為列名,它們很難執行逐日計算,例如計算每日新病例、新死亡人數和新康復人數。
讓我們重塑 3 個數據集並將它們合併為一個 DataFrame。
讀取數據集
confirmed_df = pd
.read_csv('time_series_covid19_confirmed_global.csv')
deaths_df = pd
.read_csv('time_series_covid19_deaths_global.csv')
recovered_df = pd
.read_csv('time_series_covid19_recovered_global.csv')
將它們從寬格式改造成長格式
通過運行confirmed_df.columns、deaths_df.columns 和recovered_df.columns,它們都應該輸出如下相同的結果:
請注意,列都是從第 4 列開始的日期,並獲取確認的日期列表 df.columns [4:]
在合併之前,我們需要使用melt() 將DataFrames 從當前的寬格式逆透視為長格式。 換句話說,我們將所有日期列轉換為值。 使用「省/州」、「國家/地區」、「緯度」、「經度」作為標識符變量。 我們稍後將它們進行合併。
confirmed_df_long = confirmed_df.melt(
id_vars=['Province/State', 'Country/Region', 'Lat', 'Long'],
value_vars=dates,
var_name='Date',
value_name='Confirmed'
)
deaths_df_long = deaths_df.melt(
id_vars=['Province/State', 'Country/Region', 'Lat', 'Long'],
value_vars=dates,
var_name='Date',
value_name='Deaths'
)
recovered_df_long = recovered_df.melt(
id_vars=['Province/State', 'Country/Region', 'Lat', 'Long'],
value_vars=dates,
var_name='Date',
value_name='Recovered'
)
所有結果都是新的長格式。 所有這些都按日期和國家/地區排序,因為原始數據已經按國家/地區排序,並且日期列已經按 ASC 順序排列。
這是confirmed_df_long的例子
最後,我們使用merge()將3個DataFrame一個接一個合併:
full_table = confirmed_df_long.merge(
right=deaths_df_long,
how='left',
on=['Province/State', 'Country/Region', 'Date', 'Lat', 'Long']
)
full_table = full_table.merge(
right=recovered_df_long,
how='left',
on=['Province/State', 'Country/Region', 'Date', 'Lat', 'Long']
)
現在,我們得到一個包含 Confirmed、Deaths 和 Recovered 列的完整表格:
總結
在本文中,我們介紹了 5 個用例和 1 個實際示例,這些示例使用 Pandas 的melt() 方法將 DataFrame 從寬格式重塑為長格式。 它非常方便,是數據預處理和探索性數據分析過程中最受歡迎的方法之一。
重塑數據是數據科學中一項重要且必不可少的技能。 我希望你喜歡這篇文章並學到一些新的有用的東西。
作者:B。Chen