簡體   English   中英

Pandas 合並不同名稱的列

[英]Pandas merge columns with different names

我正在嘗試使用帶有熊貓的合並功能合並電子表格。 我正在嘗試將 2018 年和 2019 年電子表格中的列 ID 和 id、TrackName 和名稱、ArtistName 和藝術家、Danceability 和 Danceability 等組合在一起。

這是我在合並時嘗試使用的代碼,

pd.merge(df, df2, left_on=  ['TrackName', 'ArtistName','ID'],
            right_on= ['name', 'artists','id'])

但是,我總是收到一條錯誤消息,說我無法在 int64 和對象列上合並。 我不確定如何使用 concat 將這些列合並在一起,所以有人可以幫助我嗎?

此外,即使我使用合並僅合並對象列而不合並 ID,(像這樣)

pd.merge(df, df2, left_on=  ['TrackName', 'ArtistName'],
            right_on= ['name', 'artists'])

它仍然不起作用,並且列沒有正確合並。 我不確定我做錯了什么。 如果可能的話,我真的很感激一些幫助!

以下是電子表格: 鏈接

pandas.merge()是一個類函數,用於生成具有主鍵外鍵的數據庫連接,就像在 SQL 樣式數據庫中一樣。 請參閱主鍵和外鍵之間的區別

這里的問題是您試圖將不同 dtypes 的值(使用df.dtypes查看 DataFrames 中所有列的類型)引入現有列。 發生這種情況是因為 pandas 將函數中分配的左側DataFrame作為“基礎”,並嘗試向其中添加新記錄,因為 dtype 不同,因此會導致錯誤。

事實上,文檔更有可能以pd.DataFrame方法的形式出現,因為它表現為(比如)“接收新行的母數據幀”。 請參閱文檔pd.DataFrame.merge

該錯誤還建議使用pandas.concat方法,因為它看到dtypes不同,並認為您可能願意只加入兩個DataFrames 如果沒有具有相同TrackNameArtist的現有記錄(例如),這可能是可取的,在這種情況下,您希望使用 concat 加入它們,因為您無法使用另一個記錄獲得有關記錄的其他信息DataFrame

我的建議是:將DataFrame 2019中的列重命名為DataFrame 2018中的列,如果它們引用相同的屬性,則使用相同的名稱,您可以使用pd.DataFrame.rename ,然后更改您想要的列的dtype進行合並並確保它們相同。 最后,嘗試使用merge功能進行外部連接,例如使用歌曲名稱。 您將查看是否有匹配項或查看所有記錄可能是不同的數據庫。

因此,您無法在 ID 上合並,因為 ID 在一個表中屬於對象數據類型,而在另一個表中屬於 int 類型:

df_2018.dtypes

id                   object
name                 object
artists              object

df_2019.dtypes

ID                 int64
TrackName         object
ArtistName        object

現在我嘗試合並'name'和'artists'的兩個表,我能夠做到這一點。 這是代碼:

new_df = pd.merge(df_2018, df_2019, left_on=['name','artists'], right_on = ['TrackName','ArtistName'])

new_df.columns

Index(['id', 'name', 'artists', 'danceability', 'energy', 'key', 'loudness',
       'mode', 'speechiness', 'acousticness', 'instrumentalness', 'liveness',
       'valence', 'tempo', 'duration_ms', 'time_signature', 'ID', 'TrackName',
       'ArtistName', 'Genre', 'BeatsPerMinute', 'Energy', 'Danceability',
       'LoudnessdB', 'Liveness', 'Valence', 'Length', 'Acousticness',
       'Speechiness', 'Popularity'],
      dtype='object')

我可以根據需要獲得所有列。 如果您仍然面臨任何問題,請告訴我。 請分享您遇到問題的列

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM