Pandas中的数据框架是一个二维数组,有行和列。数据框架是流行的Pandas Python库的主要组成部分。Pandas是一个开源的Python库,提供高性能、易于使用的数据结构和分析工具。Pandas运行在Python NumPy之上,在本教程中,我们将看看如何在Pandas中开始使用数据框架。
Pandas与Numpy
在我们看Pandas中的数据框架之前,让我们对NumPy和Pandas做一个快速的比较。
NumPy | Pandas |
|
|
列表到数据框架
我们知道什么是python列表以及如何使用它。下面是一个简单的列表。
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
print(simple_list)
['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
我们可以像这样把这个列表加载到 Pandas Dataframe 中。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
data = pd.DataFrame(simple_list)
print(data)
我们可以看到现在产生的数据看起来有些不同。你可以看到这个列表现在被组织成了行和列。
0
0 Sam
1 Bob
2 Joe
3 Mary
4 Sue
5 Sally
命名列
数字0对于列名的描述性不强,所以让我们用这段代码来改变它。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list}
data = pd.DataFrame(named_column)
print(data)
上面字典中的字符串成为列的名称,在这里是 "Name"。
添加一个列
要在Pandas Dataframe中添加一个列,我们可以这样做。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green']}
data = pd.DataFrame(named_column)
print(data)
就这样,我们现在有了一个新的 "喜爱的颜色 "列。
Name
让我们再添加一列,像这样。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
data = pd.DataFrame(named_column)
print(data)
Name Favorite Color
好了,这个数据框架看起来很不错。我们有一些行和一些列,还有一些有用的信息存储在这些行和列中。这些数据的格式对你来说开始熟悉了吗?是的,这是正确的,这看起来就像一个excel电子表格的种类!这是一个很好的概念。这是一个需要理解的好概念。pandas中的DataFrame类似于一个Excel工作表。虽然一个Excel工作簿可以包含多个工作表,但pandas的DataFrames是独立存在的。
选择列数据
一旦你有了一个可以使用的pandas Dataframe,你就可以开始从中选择数据了。下面的代码将从 "喜爱的颜色 "列中选择所有的值。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
data = pd.DataFrame(named_column)
selected_column = data['Favorite Color']
print(selected_column)
0 Blue
1 Red
2 Green
3 Blue
4 Red
5 Green
Name: Favorite Color, dtype: object
在Dataframe中选择一个值
现在我们想只得到一个人最喜欢的颜色。想象一下,我们想要乔的最爱颜色。我们如何做到这一点呢?好吧,我们可以看到Joe在2的索引行中,所以我们可以在选择一个值时提供该索引。这样我们就指定了我们要的是 "最喜欢的颜色 "列和索引值为2的行相交的那个值。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
data = pd.DataFrame(named_column)
selected_column = data['Favorite Color'][2]
print(selected_column)
Green
用iloc选择行
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
data = pd.DataFrame(named_column)
selected_column = data['Favorite Color'][2]
selected_row = data.iloc[2]
print(selected_row)
这为我们提供了在该行中发现的所有数据。我们有乔的名字、最喜欢的颜色和最喜欢的食物。
Name Joe
Favorite Color Green
Favorite Food Thai
Name: 2, dtype: object
为了得到Sue的信息,我们可以通过简单地改变传递给iloc的索引值来轻松做到这一点。
selected_row = data.iloc[4]
Name Sue
Favorite Color Red
Favorite Food Mexican
Name: 4, dtype: object
选择一个行的值
就像我们在选择一列时可以提供一个索引来选择一个特定的值一样,我们在选择行时也可以这样做。让我们只得到苏的最爱食品。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
data = pd.DataFrame(named_column)
selected_column = data['Favorite Color'][2]
selected_row = data.iloc[4]['Favorite Food']
print(selected_row)
Mexican
操纵数据框数据
就像在电子表格中一样,你可以对数据应用公式,根据现有数据创建新的数据列。让我们创建一个公式,在数据框中添加一个新的 "关于我 "列。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
data = pd.DataFrame(named_column)
formula_result = []
for i in range(len(data)):
formula_result.append(f'{data.iloc[i]["Name"]} likes {data.iloc[i]["Favorite Food"]}'
f' food and the color {data.iloc[i]["Favorite Color"]}')
data['About Me'] = formula_result
print(data)
Name ... About Me
0 Sam ... Sam likes Italian food and the color Blue
1 Bob ... Bob likes Mediterranean food and the color Red
2 Joe ... Joe likes Thai food and the color Green
3 Mary ... Mary likes Chinese food and the color Blue
4 Sue ... Sue likes Mexican food and the color Red
5 Sally ... Sally likes Spanish food and the color Green
[6 rows x 4 columns]
这看起来很不错!你是否注意到数据框架现在看起来有点不同?你看到在数据行中的那三个点了吗?这是因为如果有大量的数据需要显示,Pandas会截断输出。你可以使用**pd.set_option('display.max_columns', None)**来覆盖这一行为,就像这样。
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
pd.set_option('display.max_columns', None)
data = pd.DataFrame(named_column)
formula_result = []
for i in range(len(data)):
formula_result.append(f'{data.iloc[i]["Name"]} likes {data.iloc[i]["Favorite Food"]}'
f' food and the color {data.iloc[i]["Favorite Color"]}')
data['About Me'] = formula_result
print(data)
Name Favorite Color Favorite Food \
0 Sam Blue Italian
1 Bob Red Mediterranean
2 Joe Green Thai
3 Mary Blue Chinese
4 Sue Red Mexican
5 Sally Green Spanish
About Me
0 Sam likes Italian food and the color Blue
1 Bob likes Mediterranean food and the color Red
2 Joe likes Thai food and the color Green
3 Mary likes Chinese food and the color Blue
4 Sue likes Mexican food and the color Red
5 Sally likes Spanish food and the color Green
嗯,这有点像我们想要的,但是注意到它打印出了一些数值,然后创建了一个换行符,并打印出了我们剩下的新数值。如果你想打印出整个Dataframe,没有截断的列,输出中也没有换行,怎么办?我给你。
pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
import pandas as pd
simple_list = ['Sam', 'Bob', 'Joe', 'Mary', 'Sue', 'Sally']
named_column = {'Name': simple_list,
'Favorite Color': ['Blue', 'Red', 'Green', 'Blue', 'Red', 'Green'],
'Favorite Food': ['Italian', 'Mediterranean', 'Thai', 'Chinese', 'Mexican', 'Spanish']}
pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
data = pd.DataFrame(named_column)
formula_result = []
for i in range(len(data)):
formula_result.append(f'{data.iloc[i]["Name"]} likes {data.iloc[i]["Favorite Food"]}'
f' food and the color {data.iloc[i]["Favorite Color"]}')
data['About Me'] = formula_result
print(data)
这样我们就得到了我们要的全部输出结果
Name Favorite Color Favorite Food About Me
0 Sam Blue Italian Sam likes Italian food and the color Blue
1 Bob Red Mediterranean Bob likes Mediterranean food and the color Red
2 Joe Green Thai Joe likes Thai food and the color Green
3 Mary Blue Chinese Mary likes Chinese food and the color Blue
4 Sue Red Mexican Sue likes Mexican food and the color Red
5 Sally Green Spanish Sally likes Spanish food and the color Green
将数据框架保存到一个文件中
如果你现在想把数据框架的内容存储到一个文件中,用**.to_csv()**方法很容易做到。
data.to_csv('dataframe_to_file.csv')
一个新的文件已经出现在我们的项目中!
我们最喜欢的微软应用程序excel也能够打开新创建的文件。
当使用.to_csv()将数据框架保存到文件中时,默认的分隔符当然是逗号。如果你喜欢,可以用**sep=**参数来改变。现在让我们创建一个以制表符为界的文件。
data.to_csv('dataframe_to_file_tabs.csv', sep='\t')
将pandas数据框架保存为文本文件
尽管我们用来将数据框架写入文件的方法被命名为.to_csv(),但你并不局限于只有.csv文件。在接下来的片段中,我们将使用一个自定义的分隔符将数据框架保存到一个扩展名为.txt的文本文件中。注意,"分隔符 "必须是一个1个字符的字符串。这里我们将使用'+'字符,然后用高亮的分隔符查看结果,以便我们可以清楚地看到它。
data.to_csv('dataframe_to_text_file.txt', sep='+')
从文件中加载数据框
要将一个文件加载到数据框中,你可以使用.read_csv()函数,如下图所示。
import pandas as pd
data = pd.read_csv('dataframe_to_file.csv')
print(data)
Unnamed: 0 ... About Me
0 0 ... Sam likes Italian food and the color Blue
1 1 ... Bob likes Mediterranean food and the color Red
2 2 ... Joe likes Thai food and the color Green
3 3 ... Mary likes Chinese food and the color Blue
4 4 ... Sue likes Mexican food and the color Red
5 5 ... Sally likes Spanish food and the color Green
[6 rows x 5 columns]
为了在将文件读入数据框架时看到非截断的数据,我们可以使用方便的pd.set_option('display.max_columns', None)和pd.set_option('display.expand_frame_repr', False) 选项。
import pandas as pd
pd.set_option('display.max_columns', None)
pd.set_option('display.expand_frame_repr', False)
data = pd.read_csv('dataframe_to_file.csv')
print(data)
Unnamed: 0 Name Favorite Color Favorite Food About Me
0 0 Sam Blue Italian Sam likes Italian food and the color Blue
1 1 Bob Red Mediterranean Bob likes Mediterranean food and the color Red
2 2 Joe Green Thai Joe likes Thai food and the color Green
3 3 Mary Blue Chinese Mary likes Chinese food and the color Blue
4 4 Sue Red Mexican Sue likes Mexican food and the color Red
5 5 Sally Green Spanish Sally likes Spanish food and the color Green
如何在pandas中使用sqlite
从SQLite数据库中向pandas读取数据是可能的。我们可以从一个不同的应用程序中借用一个样本数据库来实现这个目的。为了利用这一技术,我们可以导入sqlite3,设置一个连接变量,然后像这样使用pd.read_sql()函数。
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
print(data)
id ... calls
0 416 ... AMC,MRNA,TSLA,BYND,SNAP,CHPT,NCTY,GOOGL,VXRT,N...
1 418 ... AMC,SNAP,FSR,PFE,AMD,MRNA,ZEV,AMZN,BAC,SBUX,NV...
2 419 ... FUBO,AMC,COIN,AMD,BA,AMZN,CAT,SPCE,CHPT,RBLX,N...
3 424 ... MRNA,IP,AMC,AMZN,MU,SONO,HYRE,ROKU,AMD,HOOD,PC...
4 425 ... WISH,AMZN,AMD,SPCE,BABA,LAZR,EBAY,AMC,ZNGA,MRN...
.. ... ... ...
117 738 ... INTC,TSLA,LCID,NIO,AMZN,BA,AMD,UAA,CLX,HOOD,SK...
118 740 ... AMZN,TSLA,BA,HOOD,NIO,AMD,TWTR,AFRM,AMC,BHC,FL...
119 743 ... AMD,AFRM,PLUG,NVDA,HOOD,TTWO,BA,UPS,TLRY,XOM,F...
120 746 ... UPST,XOM,AMD,Z,FCX,GO,NFLX,RBLX,DWAC,AMRN,FDX,...
121 748 ... PYPL,AMD,FB,GOOGL,RBLX,SQ,WFC,PENN,QCOM,AMGN,T...
[122 rows x 4 columns]
使用head()和tail()
你可能想看看数据框架中的第一组或最后一组记录。这可以使用head()或tail()函数来完成。默认情况下,head()将显示前5条结果,tail()将显示最后5条结果。如果你想看前7条记录,或最后10条记录,可以给这两个函数传递一个整数。下面是head()和tail()的几个例子。
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
print(data.head())
id ... calls
0 416 ... AMC,MRNA,TSLA,BYND,SNAP,CHPT,NCTY,GOOGL,VXRT,N...
1 418 ... AMC,SNAP,FSR,PFE,AMD,MRNA,ZEV,AMZN,BAC,SBUX,NV...
2 419 ... FUBO,AMC,COIN,AMD,BA,AMZN,CAT,SPCE,CHPT,RBLX,N...
3 424 ... MRNA,IP,AMC,AMZN,MU,SONO,HYRE,ROKU,AMD,HOOD,PC...
4 425 ... WISH,AMZN,AMD,SPCE,BABA,LAZR,EBAY,AMC,ZNGA,MRN...
[5 rows x 4 columns]
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
print(data.head(7))
id ... calls
0 416 ... AMC,MRNA,TSLA,BYND,SNAP,CHPT,NCTY,GOOGL,VXRT,N...
1 418 ... AMC,SNAP,FSR,PFE,AMD,MRNA,ZEV,AMZN,BAC,SBUX,NV...
2 419 ... FUBO,AMC,COIN,AMD,BA,AMZN,CAT,SPCE,CHPT,RBLX,N...
3 424 ... MRNA,IP,AMC,AMZN,MU,SONO,HYRE,ROKU,AMD,HOOD,PC...
4 425 ... WISH,AMZN,AMD,SPCE,BABA,LAZR,EBAY,AMC,ZNGA,MRN...
5 427 ... TWTR,AMD,AMC,WISH,HOOD,FANG,SONO,SNAP,SPCE,BYN...
6 430 ... PFE,MSFT,BABA,AMZN,TSLA,AAPL,MRNA,NIO,WISH,BBW...
[7 rows x 4 columns]
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
print(data.tail(10))
id ... calls
112 724 ... AMD,NVDA,LAZR,AFRM,BHC,MRNA,GM,AA,PTON,HZO,MAR...
113 727 ... AMD,TSLA,NVDA,AMC,PTON,NFLX,AMZN,DISH,NRG,FB,L...
114 731 ... TSLA,NVDA,AMD,AMC,AAPL,FB,MSFT,AAL,RBLX,AMZN,B...
115 734 ... NVDA,TSLA,AMC,MSFT,AMD,AMZN,FB,BABA,BAC,EW,ZM,...
116 736 ... AMC,T,MSFT,FB,CVX,NVDA,BABA,AMD,RUN,PLTR,INTC,...
117 738 ... INTC,TSLA,LCID,NIO,AMZN,BA,AMD,UAA,CLX,HOOD,SK...
118 740 ... AMZN,TSLA,BA,HOOD,NIO,AMD,TWTR,AFRM,AMC,BHC,FL...
119 743 ... AMD,AFRM,PLUG,NVDA,HOOD,TTWO,BA,UPS,TLRY,XOM,F...
120 746 ... UPST,XOM,AMD,Z,FCX,GO,NFLX,RBLX,DWAC,AMRN,FDX,...
121 748 ... PYPL,AMD,FB,GOOGL,RBLX,SQ,WFC,PENN,QCOM,AMGN,T...
[10 rows x 4 columns]
在一个数据框架中过滤
我们从sqlite数据库中提取的数据框架有100多条记录。我们可能想对其进行过滤,以限制查看的数据量,我们如何做到这一点?有一个特殊的语法,下面强调了这一点。
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
filtered_row = data[data['created_at'].str.contains('2022-01-24')]
print(filtered_row)
id ... calls
114 731 ... TSLA,NVDA,AMD,AMC,AAPL,FB,MSFT,AAL,RBLX,AMZN,B...
[1 rows x 4 columns]
替换数据框中的值
要替换数据框中的一个或多个值,我们可以使用.replace()函数。下面是该技术的一个例子。
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
replaced_ticker = data.replace(to_replace='AMC', value='replaced!', regex=True)
print(replaced_ticker)
id ... calls
0 416 ...
删除列
要从数据框架中移除一个列,只需像这样使用.drop()函数。
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
removed_column = data.drop('calls', axis=1)
print(removed_column)
id created_at updated_at
0 416 2021-08-09 20:29:27.252553 2021-08-09 20:29:27.252553
1 418 2021-08-10 18:36:36.024030 2021-08-10 18:36:36.024030
2 419 2021-08-11 14:41:28.597140 2021-08-11 14:41:28.597140
3 424 2021-08-12 20:18:08.020679 2021-08-12 20:18:08.020679
4 425 2021-08-13 18:27:07.071109 2021-08-13 18:27:07.071109
.. ... ... ...
117 738 2022-01-27 21:18:50.158205 2022-01-27 21:18:50.159205
118 740 2022-01-28 22:12:43.995624 2022-01-28 22:12:43.995624
119 743 2022-01-31 20:52:06.498233 2022-01-31 20:52:06.498233
120 746 2022-02-01 21:01:50.009382 2022-02-01 21:01:50.009382
121 748 2022-02-02 21:17:53.769019 2022-02-02 21:17:53.769019
[122 rows x 3 columns]
从数据框架中移除行
在这个例子中,我们将从数据框架中移除数据行,同时用一个列表来指定一个以上的标签。
import pandas as pd
import sqlite3
connection = sqlite3.connect('db.sqlite3')
data = pd.read_sql('select * from stockapp_call', connection)
removed_row = data.iloc[0:3].drop(['id', 'created_at', 'updated_at'], axis=1)
print(removed_row)
calls
0 AMC,MRNA,TSLA,BYND,SNAP,CHPT,NCTY,GOOGL,VXRT,N...
1 AMC,SNAP,FSR,PFE,AMD,MRNA,ZEV,AMZN,BAC,SBUX,NV...
2 FUBO,AMC,COIN,AMD,BA,AMZN,CAT,SPCE,CHPT,RBLX,N...
什么是潘达斯数据框架摘要
pandas.DataFrame数据结构使得处理二维数据非常有效。我们看到了几种创建和使用Pandas DataFrame的方法,以及如何在使用DataFrame时执行一些常见的功能,如访问、修改、添加、排序、过滤和删除数据。