什么是潘达斯数据框架

235 阅读13分钟

What Is A Pandas Dataframe

Pandas中的数据框架是一个二维数组,有行和列。数据框架是流行的Pandas Python库的主要组成部分。Pandas是一个开源的Python库,提供高性能、易于使用的数据结构和分析工具。Pandas运行在Python NumPy之上,在本教程中,我们将看看如何在Pandas中开始使用数据框架。


Pandas与Numpy

在我们看Pandas中的数据框架之前,让我们对NumPy和Pandas做一个快速的比较。

NumPy
Pandas
  • 低级别的数据结构np.array
  • 支持大型多维数组和矩阵
  • 广泛的数学数组操作
  • 高层次的数据结构,数据框架
  • 更精简的处理表格数据和丰富的时间序列功能
  • 数据排列、统计、groupby、合并和连接方法
  • 你可以使用Pandas数据结构来借鉴NumPy和SciPy函数来操作它们

列表到数据框架

我们知道什么是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')

一个新的文件已经出现在我们的项目中!

save dataframe to file

我们最喜欢的微软应用程序excel也能够打开新创建的文件。

dataframe opened in excel

当使用.to_csv()将数据框架保存到文件中时,默认的分隔符当然是逗号。如果你喜欢,可以用**sep=**参数来改变。现在让我们创建一个以制表符为界的文件。

data.to_csv('dataframe_to_file_tabs.csv', sep='\t')

tab delimited pandas dataframe

将pandas数据框架保存为文本文件

尽管我们用来将数据框架写入文件的方法被命名为.to_csv(),但你并不局限于只有.csv文件。在接下来的片段中,我们将使用一个自定义的分隔符将数据框架保存到一个扩展名为.txt的文本文件中。注意,"分隔符 "必须是一个1个字符的字符串。这里我们将使用'+'字符,然后用高亮的分隔符查看结果,以便我们可以清楚地看到它。

data.to_csv('dataframe_to_text_file.txt', sep='+')

pandas delimiter must be a 1-character string


从文件中加载数据框

要将一个文件加载到数据框中,你可以使用.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时执行一些常见的功能,如访问、修改、添加、排序、过滤和删除数据。