[英]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
。 如果沒有具有相同TrackName和Artist的現有記錄(例如),這可能是可取的,在這種情況下,您希望使用 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.