如何在Python Pandas中使用模板向DataFrame追加新行
如何在Python Pandas中使用模板向DataFrame追加新行。
引言
作為一名資料工程專家,我經常最終建立的派生列多於行,因為建立和傳送資料給我進行分析的任務應該由其他資料庫專家負責。然而,這並非一直如此。
我們必須建立樣本行,而不是等待資料專家團隊傳送資料給我們。在本主題中,我將展示建立行的巧妙技巧。
如何操作…
在本示例中,我們將首先使用.loc屬性向小型資料集追加行,然後將使用.append方法。
1.讓我們首先建立一個稍後新增行的DataFrame。
示例
import pandas as pd import numpy as np players_info = pd.DataFrame(data=[ {"players": "Roger Federer", "titles": 20}, {"players": "Rafael Nadal", "titles": 20}, {"players": "Novak Djokovic", "titles": 17}, {"players": "Andy Murray", "titles": 3}], columns=["players", "titles"])
輸出
print(players_info.info())
示例
<class 'pandas.core.frame.DataFrame'> RangeIndex: 4 entries, 0 to 3 Data columns (total 2 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 players 4 non-null object 1 titles 4 non-null int64 dtypes: int64(1), object(1) memory usage: 192.0+ bytes None
1. 現在讓我們使用.loc屬性向DataFrame中新增新的球員“Dominic Theim”。
new_Player = ['Dominic Theim', 1] players_info.loc[4] = new_Player
輸出
print(players_info)
players titles 0 Roger Federer 20 1 Rafael Nadal 20 2 Novak Djokovic 17 3 Andy Murray 3 4 Dominic Theim 1
1. 使用相同的.loc屬性,讓我們將新行新增到DataFrame的末尾。這裡我將展示如何向DataFrame新增字典。
new_player = {'players': 'Daniel Medvedev', 'titles': 0} players_info.loc[len(players_info)] = new_player
輸出
print(players_info)
players titles 0 Roger Federer 20 1 Rafael Nadal 20 2 Novak Djokovic 17 3 Andy Murray 3 4 Dominic Theim 1 5 Daniel Medvedev 0
1. 我們還可以向DataFrame新增包含資料的Pandas Series。
players_info.loc[len(players_info)] = pd.Series({'players': 'Andy Zverev', 'titles': 0})
輸出
print(players_info)
players titles 0 Roger Federer 20 1 Rafael Nadal 20 2 Novak Djokovic 17 3 Andy Murray 3 4 Dominic Theim 1 5 Daniel Medvedev 0 6 Andy Zverev 0
結論
我們已經使用.loc方法在上面4個步驟中添加了資料。.loc屬性就地修改DataFrame。
在接下來的幾個步驟中,我們將瞭解.append方法,它不會修改呼叫DataFrame,而是返回一個包含附加行的新DataFrame副本。
.append的第一個引數必須是另一個DataFrame、Series、字典或列表。
示例
# Create a DataFrame with index players_info = pd.DataFrame(data=[ {"players": "Roger Federer", "titles": 20}, {"players": "Rafael Nadal", "titles": 20}, {"players": "Novak Djokovic", "titles": 17}, {"players": "Andy Murray", "titles": 3}], columns=["players", "titles"], index=["roger", "nadal", "djokovic", "murray"])
# Add a new row(dictionary) to DataFrame using .append method. players_info.append({'players': 'Daniel Medvedev', 'titles': 0})
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) in 1 # Add a new row(dictionary) to DataFrame using .append method. ----> 2 players_info.append({'players': 'Daniel Medvedev', 'titles': 0}) ~\anaconda3\lib\site-packages\pandas\core\frame.py in append(self, other, ignore_index, verify_integrity, sort) 7046 other = Series(other) 7047 if other.name is None and not ignore_index: -> 7048 raise TypeError( 7049 "Can only append a Series if ignore_index=True " 7050 "or if the Series has a name"
TypeError 只能在ignore_index=True或Series具有名稱時附加Series
當我嘗試追加字典時,它引發了一個異常,要求我們使用引數ignore_index=True。所以讓我新增這個建議的引數並看看它有什麼作用。
new_df = players_info.append({'players': 'Daniel Medvedev', 'titles': 0}, ignore_index=True)
輸出
print(f" *** Original with index \n {players_info} \n\n\n *** Modified index \n {new_df}")
*** Original with index players titles roger Roger Federer 20 nadal Rafael Nadal 20 djokovic Novak Djokovic 17 murray Andy Murray 3 *** Modified index players titles 0 Roger Federer 20 1 Rafael Nadal 20 2 Novak Djokovic 17 3 Andy Murray 3 4 Daniel Medvedev 0
在我使用ignore_index=True引數後,你從輸出中觀察到了什麼?是的,當ignore_index設定為True時,舊索引將被完全刪除並替換為從0到n-1的RangeIndex。
.append方法在您想一次性向DataFrame新增多行時非常有用。
player1 = pd.Series({'players': 'Andy Zverev', 'titles': 0}, name='zverev') player2 = pd.Series({'players': 'Dominic Theim', 'titles': 1}, name='theim') new_df_1 = players_info.append([player1, player2])
輸出
print(new_df_1)
players titles roger Roger Federer 20 nadal Rafael Nadal 20 djokovic Novak Djokovic 17 murray Andy Murray 3 zverev Andy Zverev 0 theim Dominic Theim 1
好的,現在您已經瞭解瞭如何新增行的基本知識,我們將深入探討如何在具有許多列的DataFrame中新增行。
df = pd.read_csv("https://raw.githubusercontent.com/sasankac/TestDataSet/master/movies_data.csv")
輸出
print(df.info())
示例
<class 'pandas.core.frame.DataFrame'> RangeIndex: 4803 entries, 0 to 4802 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 budget 4803 non-null int64 1 id 4803 non-null int64 2 original_language 4803 non-null object 3 original_title 4803 non-null object 4 popularity 4803 non-null float64 5 release_date 4802 non-null object 6 revenue 4803 non-null int64 7 runtime 4801 non-null float64 8 status 4803 non-null object 9 title 4803 non-null object 10 vote_average 4803 non-null float64 11 vote_count 4803 non-null int64 dtypes: float64(3), int64(4), object(5) memory usage: 450.4+ KB None
來自Google的這個資料集有12列,如果您手動輸入新資料行,很容易輸錯列名或忘記一列。那麼我們如何避免這個問題呢?有一種方法,只需建立一個列名模板。
columns_dictionary = df.iloc[0].to_dict()
##### Output:
print(columns_dictionary)
{'budget': 237000000, 'id': 19995, 'original_language': 'en', 'original_title': 'Avatar', 'popularity': 150.437577, 'release_date': '10/12/2009', 'revenue': 2787965087, 'runtime': 162.0, 'status': 'Released', 'title': 'Avatar', 'vote_average': 7.2, 'vote_count': 11800}
因此,您現在可能明白了,我們已經獲取了第一行並將其轉換為字典。好的,我們也得到了列和值,現在讓我們使用字典推導式清除舊值,將任何之前的字串值分配為空字串,其他值分配為缺失值。
此字典現在可以作為您想要輸入的任何新資料的模板。
示例
import datetime new_data_dict = {} for a, b in columns_dictionary.items(): if isinstance(b, str): new_data_dict[a] = np.random.choice(list('abcde')) elif isinstance(b, datetime.date): new_data_dict[a] = np.nan else: new_data_dict[a] = np.nan
輸出
print(new_data_dict)
{'budget': nan, 'id': nan, 'original_language': 'e', 'original_title': 'a', 'popularity': nan, 'release_date': 'b', 'revenue': nan, 'runtime': nan, 'status': 'e', 'title': 'c', 'vote_average': nan, 'vote_count': nan}