使用Pandas melt()重塑DataFrame

fans news 發佈 2022-01-02T23:36:24+00:00

重塑 DataFrame 是數據科學中一項重要且必不可少的技能。 在本文中,我們將探討 Pandas Melt() 以及如何使用它進行數據處理。最簡單的melt最簡單的melt()不需要任何參數,它將所有列變成行(顯示為列變量)並在新列值中列出所有關聯值。df_wide.

重塑 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

關鍵字: