如何使用 Python Pandas 中的模板将新行附加到 DataFrame
如何使用 Python Pandas 中的模板将新行附加到 DataFrame。
简介
作为一名数据工程专家,我经常会创建比行更多的派生列,因为创建和将数据发送给我进行分析的角色应该由其他数据库专家负责。然而,这并不总是正确的。
我们必须创建示例行,而不是等待数据专家团队向我们发送数据。在本主题中,我将 展示创建行的巧妙技巧。
如何操作..
在本指南中,我们将首先使用 .loc 属性将行附加到一个小数据集,然后使用 .append 方法。
1.让我们首先创建一个数据框,以便稍后添加行。
示例
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 属性将新球员"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 属性,让我们将新行添加到数据框的末尾。这里我将展示如何将字典添加到数据框。
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. 我们还可以将保存数据的 pandas 系列添加到数据框中。
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、字典或列表。
示例
# 创建带索引的 DataFrame
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"])
# 使用 .append 方法向 DataFrame 添加新行(字典)。
players_info.append({'players': 'Daniel Medvedev', 'titles': 0})
--------------------------------------------------------------------------------------
TypeError Traceback (most recent call last)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
in
1 # 使用 .append 方法向 DataFrame 添加新行(字典)。
----> 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。
当您想要一次性向 DataFrame 添加多行时,.append 方法非常有用。
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
好的,现在您已经了解了如何添加行的基础知识,我们将深入研究如何在具有多列的数据框上添加行。
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}
相关文章
有用资源
python 参考教程 - 该教程包含有关 python 的更多信息:https://www.cainiaomax.com/python/

