如何使用Python Pandas的模板将新行附加到DataFrame中

如何使用Python Pandas的模板将新行附加到DataFrame中

如何使用Python Pandas的模板将新行附加到DataFrame中。

介绍

作为数据工程专家,我经常创建比行更多的派生列,因为创建并发送数据供其他数据库专家分析的角色应由其他人承担,但并非始终如此。

我们必须创建样本行,而不是等待数据专家团队向我们发送数据。在本主题中,我将展示创建行的巧妙技巧。

更多Pandas文章,请阅读:Pandas教程

如何实现

在这个示例中,我们将首先使用.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属性会对数据框做出修改。

在接下来的几个步骤中,我们将看一下.append方法,它不会修改调用数据框,而是返回带有附加行的数据框的新副本。

.append的第一个参数必须是另一个数据框,序列,字典或列表。

例如

# 创建一个带有索引的数据框
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方法将一个新行(字典)添加到数据框中。
players_info.append({'players': 'Daniel Medvedev', 'titles': 0})
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
在
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 "只有在 ignore_index=True 或 Series 有名称时才能添加 Series "
7050 "."

 TypeError 只有在 ignore_index=True 或 Series 有名称时才能添加 Series

当我尝试添加字典时,它引发了一个异常,要求我们使用参数 ignore_index=True。因此,请让我添加此建议的参数并查看它的作用。

new_df = players_info.append({'players': 'Daniel Medvedev', 'titles': 0}, ignore_index=True)

输出

print(f" *** 原始带索引 \n {players_info} \n\n\n *** 修改后的索引 \n {new_df}")
*** 原始带索引
players titles
roger Roger Federer 20
nadal Rafael Nadal 20
djokovic Novak Djokovic 17
murray Andy Murray 3

*** 修改后的索引
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

好的,现在您已经了解了如何添加行的基础知识,我们将深入研究如何在具有多列的数据框中添加行。

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()
输出:
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教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程