如何创建Pandas DataFrame:一台实践指南
任何数据科学项目中的第一个也是最重要的步骤正在创建和将数据加载到Pandas DataFrames中。Pandas是Python数据科学生态系统的重要组成部分。数据科学家合并,使用Pandas DataFrame进行操作,操作和分析表格数据。最后,他们准备机器学习数据。
现实世界的数据通常是不洁,无组织和非结构化的。任何项目开头的主要挑战是:
- 定义项目所需的数据。
- 查找并识别正确的数据源。
- 将数据从数据源加载到Pandas DataFrame中。
- 清洁,过程和操纵数据。
最后更新5月2021
PANDAS充分解释|150+练习|必须有机器学习和金融技能|+ Scikit-reath和Seaborn |由亚历山大Hagmann
探索课程在本文中,我将解释如何将数据从最常见的数据源加载到Pandas DataFrames中。您将学习如何将步骤3和4组合:在将其加载到DataFrame的行和列格式时尽可能多地清洁和塑造数据。这节省了大量的时间和额外的工作流程。简而言之,更顺畅的数据导入,整个项目越高。
数据源 - 概述
我们可以将数据源分为四组:Python(及其基本数据结构),本地文件,Internet和数据库。有些人认为还有另一个来源:数据存储在其他熊猫DataFrames和Pandas系列中。
- Python:您可以从存储在其他(基本)Python数据结构中的数据中创建Dataframe,如列表,词典和Numpy阵列。
- 本地文件:在两个熊猫编码会话之间,它是一个非常常见的工作流程,用于将数据存储在本地文件中。最常用的文件类型是Excel,逗号分隔值)(CSV)和JavaScript对象表示法(JSON)。这些文件类型用于与其他文件共享和交换表格数据。虽然CSV文件和Excel文件用于简单的二维数据,但您可以使用JSON文件来存储更复杂,嵌套数据。
- 互联网:商业数据提供程序允许通过Web应用程序编程接口(API)下载数据。Web API可以是免费的或基于费用的。您可以通过提交自定义HTTP请求来从Web API中提取数据。之后,您可以在CSV文件或JSON文件中收到所请求的数据。刮擦网站是另一种将数据从网络获取到Python和Pandas的方法。请记住,Web刮擦是一个合法的灰色区域。
- 数据库:关系数据库是存储大型和复杂数据的一种非常常见的方法。几个Python库允许您连接到基于本地和基于Web的(云)数据库服务器。一旦连接,有一些解决方案可用于将数据从数据库加载到Python和Pandas中。
- 熊猫:您可以更改,操作,聚合和合并现有数据标记以创建新的DataFrame。Pandas系列可以转换为DataFrame,并且多个Pandas系列可以连接到一个DataFrame中。
了解Pandas Dataframes.
让我们来看看以下小的dataframeDF.包含有关五个足球运动员的信息:
dataframe是二维标记数据结构。在我们的例子中,DF.有五行和五列。每一行是一名足球运动员(例如,“莱昂内尔·梅西“)。每列包含有关玩家的信息(例如,高度为米)。列“名称”左边不是一列。它是DataFrame的索引。索引对行进行标记。在我们的示例中,行是由玩家名称标记的。如果没有指定,DataFrames有一个RangeIndex,整数为升序整数(0,1,2,…)。在顶部,我们可以找到列标题(例如,“Country”)。最佳实践是拥有惟一的行标签和惟一的列标题。这允许您清楚地标识行和列。
创建DataFrames时,请遵循以下三个规则:
- 在行中组织观察(例如,足球运动员)
- 在列中组织特征/变量(例如,玩家的高度)
- 同质数据:列中的所有元素必须具有相同的数据类型(DTYPE)
您可以查看数据类型信息()方法。
df.info()
dtype.目的要么指示字符串/文本数据或混合数据类型。在我们的示例中,我们在列中拥有众所周知的字符串/文本数据“国家/地区“和“club_2019”。所以,DF.符合所有三个条件。
如何在Python中创建具有基本数据结构的Dataframe
作为第一步,导入熊猫库进口熊猫作为PD每当你与熊猫合作。
进口熊猫作为PD
如果您已经在基本Python结构中拥有数据,则可以使用pandas dataframe对象创建pd.dataframe()。您遵循的后续步骤取决于数据的组织方式。有两个主要场景:1。您已在列表/阵列中拥有列。2.您已在列表/数组中拥有行。
- 列在列表中('字典场景')
让我们假设您已经存储在列表中的列(不包括标题):国家,俱乐部,WC,高度,目标。此外,您列出了列表中的行标签:名称。
名称= [“莱昂内尔·梅西”,“克里斯蒂亚诺·罗纳尔多”,“Neymar junior”,“kylian mbappe”,“manuel neuer”,“manuel neuer”国家= [“阿根廷”,“葡萄牙”,“巴西”,“法国”,“德国”,“德国”] Club = [“FC Barcelona”,“juventus fc”,“巴黎SG”,“巴黎SG”,“FC拜仁”,“FC拜仁”] WC = [FALSE,FALSE,FALSE,TRUE,TRUE]高度= [1.70,1.87,1.75,1.78,1.93] GOALAS = [51,28,23,39,0]
在这种情况下,最好创建包含所有列的字典。字典中的每个键值对包括适当的列标题(例如,Club_2019)作为键和相应的列表为价值(俱乐部)。让我们创建词典数据:
数据= {“国家”:国家,“Club_2019”:Club,“WC”:WC,“Height_m”:Height,“GoALS_2019”:目标}
我们已准备好创建DataFrame对象DF.和pd.dataframe()。通过字典数据到参数数据并定义那个名称应该是dataframe的索引索引=名称。
df = pd.dataframe(data = data,index = names)
最后,可以为索引分配一个名称df.index.name =。在我们的示例中,我们分配“名称”。
df.index.name =“name”
让我们最后看一看DF.:
- 在列表中具有行('嵌套列表方案')
让我们假设您已经存储在列表中的所选行(包括行标签):Messi,Ronaldo,Neymar,Mbappe,Neuer。
Messi = [“莱昂内尔·梅西”,“阿根廷”,“FC Barcelona”,False,1.7,51]罗纳尔多= [“Cristiano Ronaldo”,“葡萄牙”,“尤文图斯FC”,FALSE,1.87,28] Neymar = [“Neymar Junior“,”巴西“,”巴黎SG“,False,1.75,23] Mbappe = [”Kylian Mbappe“,”法国“,”巴黎SG“,True,1.78,39] Neuer = [”Manuel Neuer“,“德国”,“FC拜仁”,真实,1.93,0]
此外,您在列表中有所需的列标题。
标题= [“名称”,“国家”,“Club_2019”,“WC”,“Height_m”,“GoALS_2019”]
在这种情况下,最好创建列表的列表。让我们把所有行放入嵌套列表“data”中:
数据= [Messi,Ronaldo,Neymar,Mbappe,Neuer]
我们已准备好创建DataFrame对象DF.和pd.dataframe()。传递嵌套列表“数据“到参数数据并定义“标题”应该是DataFrame的列标题列=标题。
df = pd.dataframe(data = data,columns = headers)
让我们检查DF.:
在这种情况下,我们最终有六列(包括名称)和RangeIndex。您可以将索引设置为列名称用方法set_index()。要更改DataFrame对象DF.使用新索引,设置inplace =真的。否则,索引的更改不会保存在内存中。
Players.Set_Index(“名称”,InPlace = True)
我们终于存在:
左上有一个场景:如果我们从字典开始怎么办数据具有错误的数据组织:每个键值对都是行/观察?
数据= {“Lionel Messi”:[“阿根廷”,“FC Barcelona”,False,1.7,51],“Cristiano Ronaldo”:[“葡萄牙”,“尤文图斯FC”,False,1.87,28],“Neymar Junior“:[”巴西“,”巴黎SG“,False,1.75,23],”Kylian Mbappe“:[”法国“,”巴黎SG“,True,1.78,39],”Manuel Neuer“:[”德国“,“fc拜仁”,true,1.93,0]}
如果你通过字典数据至pd.dataframe(),您将结束一个dataframe,其中观察在列中,功能是行。这不是您可以使用的dataframe!您可以用几个熊猫命令解决这个问题。但是有一种更好的方法可以让您完全避免这种问题。最好重新组织词典数据并创建嵌套列表。
indested_list = [] for key,data.items():value.insert(0,key)inested_list.append(值)
我们回到了方案2:
df = pd.dataframe(data = nested_list,columns = headers)df.set_index(“name”,inplace = true)
如何将基本集加载到Pandas DataFrames中的数据集
您可以将计算机上的本地文件加载到Pandas上的本地文件pd.read_xxx()家庭:
- 加载CSV文件pd.read_csv()
- 加载Excel文件pd.read_excel ()
- 加载JSON文件pd.read_json()
- 还有一些......
pd.read_csv()和pd.read_excel ()非常相似并分享大多数选项和参数。
从CSV和Excel文件加载数据时,您应该知道的5件事
- 地点
从本地文件加载数据时,您需要知道的第一个也是最重要的事情:文件的位置。将完整的文件路径/名称传递为参数的字符串filepath_or_buffer.。以下是创建DataFrame对象的模板DF.来自CSV和Excel文件:
df = pd.read_csv(filepath_or_buffer = full_file_name)#csv文件df = pd.read_excel(filepath_or_buffer = full_file_name)#excel文件
请注意,您可以省略“filepath_or_buffer = '。
让我们假设CSV文件Players.csv.位于我的桌面上。打开文件时,我们可以看到以下结构:
名字,国家,Club_2019, WC, Height_m Goals_2019梅西,阿根廷,巴塞罗那,假的,1.7,51克里斯蒂亚诺·罗纳尔多,葡萄牙,尤文图斯俱乐部,假的,1.87,28内马尔初级,巴西、巴黎SG,假的,1.75,23 Kylian Mbappe,法国,巴黎SG,真的,1.78,39曼努埃尔,德国,拜仁,真的,1.93,0
CSV文件是一个分隔的文本文件,它使用逗号来分隔值。您仍然可以看到表格数据结构。文件的每一行是数据记录(足球运动员)。每个记录包括一个或多个值,由逗号分隔。
Windows上的完整文件名可以是C:\用户\ Alex \ Desktop \ Players.csv
MacOS和Linux上的完整文件名可能是:/users/alex/desktop/players.csv.
请注意,Windows使用反斜杠(“\”)而不是斜杠(“/”)。由于Backslash是Python中的特殊字符,因此使用以下代码将丢弃错误:
df = pd.read_csv(“c:\ users \ alex \ desktop \ players.csv”)
如何解决此问题有两种方法:
- 使用正斜杠(“/”):
df = pd.read_csv(“c:/users/alex/desktop/players.csv”)
- 使用前缀R:
df = pd.read_csv(r“c:\ users \ alex \ desktop \ players.csv”)
在MacOS和Linux上,单一最佳解决方案是:
df = pd.read_csv(“/用户/ alex / desktop / players.csv”)
如果文件Players.csv.在您当前的工作目录(CWD)中,通过文件名就足够了Players.csv.没有完整的道路。请注意,CWD可能会有所不同,取决于您的系统和Python安装。
df = pd.read_csv(“players.csv”)
从Excel文件加载玩家数据集players.xlsx.相应地工作。
df = pd.read_excel(r“c:\ users \ alex \ desktop \ players.xlsx”)#windows
- 设置索引
您可以选择列为DataFrame的索引。您选择的列应仅包含唯一的值(无重复)。在我们的示例中,设置名称栏目作为索引合理,可以使用index_col =“名称“。
df = pd.read_csv(...,index_col =“name”)
您还可以通过列索引位置来而不是传递列标题。在我们的例子中,名称处于列索引位置0。
df = pd.read_csv(...,index_col = 0)
如果您未指定索引,Pandas会创建一个RangeIndex。
(从Excel文件加载玩家数据集players.xlsx.以同样的方式工作。)
- 选择列
无需将所有列加载到熊猫中。您可以通过将列表传递到参数来选择特定列usecols。例如,您可以加载列名称那国家, 和GOALS_2019和USECOLS = [“名称”,“国家”,“GOALAS_2019”]
df = pd.read_csv(…那usecols= ["Name", "Country", "Goals_2019"])
这会创建DataFrameDF.带有RangeIndex。当然,你可以结合起来usecols和index_col.:
df = pd.read_csv(...,usecols = [“name”,“country”,“goals_2019”],index_col =“name”)
从Excel文件加载玩家数据集players.xlsx.相应地工作。但还有一个选择。您还可以在字符串中指定Excel列(A,B,C,...)中的Excel列(A,B,C,...):USECOLS =“A,B,D”。
df = pd.read_excel(...,useecols =“a,b,d”)
这将Excel列A,B和D加载到熊猫。
- 列标题
有时,外部文件中没有列标题。此数据集从第一个观察开始(Lionel Messi)。让我们考虑CSV文件Players.csv.没有列标题:
莱昂内尔·梅西,阿根廷,FC巴塞罗那,False,1.7,51克里斯蒂亚诺罗纳尔多,葡萄牙,尤文图斯FC,FALSE,1.87,28 Neymar初级,巴西,巴黎SG,False,1.75,23 Kylian Mbappe,France,Paris SG,True,1.78,39 Manuel Neuer,德国,FC拜仁,True,1.93,0
和头=没有您指定文件中没有列标题。头=没有通常与参数结合使用名字。您可以通过适当的列标题列表名称:
df = pd.read_csv(...,header = none,名称= [名称“,”国家“,”club_2019“,”wc“,”height_m“,”goals_2019“))
如果该文件包含不合适的列标题,则可以使用该标头更改名称(不要使用头=没有这里!)。
df = pd.read_csv(...,名称= [名称“,”国家“,”club_2019“,”wc“,”height_m“,”goals_2019“))
- 日期和时间
某些数据集具有包含日期和时间信息的列('datetime')。以下CSV文件Stocks.csv.包含微软(MSFT)和Apple(AAPL)的每日股价:
日期,AAPL,MSFT 2020-05-04,293.16,178.84 2020-05-05,297.56,180.76 2020-05-06,76 2020-05-06,300.63,182.54 2020-05-07,303.74,183.60 2020-05-08,31013,184.68
如果未指定,Pandas将DateTime信息作为String / Object数据类型加载。大多数时候,期望将这些列的数据类型转换为DateTime64.经过将列标题传递到列表中的参数parse_dates。这通常与之结合使用index_col.创建DateTimeIndex。使用Pandas管理和分析金融数据很容易进行DateTimeIndex。
df = pd.read_csv(...,parse_dates = [“日期”],index_col =“日期”)df.info()
使用pd.read_csv()和pd.read_excel()有更多的选项可自定义数据导入。了解如何导入来自凌乱和不洁CSV和Excel文件的数据。
如何从JSON文件加载数据
以下是创建DataFrame对象的模板DF.来自JSON文件Players.json.和pd.read_json():
df = pd.read_json(full_file_name)
从JSON文件加载数据时,很少有选择。JSON文件用于存储和传输复杂和嵌套数据集。有时,您必须使用该参数东方或用数据达到数据pd.json_normalize()(学到更多)。
如何将数据集加载到Pandas DataFrames中
Twitter,Yahoo Finance或电影数据库等平台允许用户通过其Web API检索数据。API文档包含有关使用Web API的详细说明。用户需要将HTTP请求(如API文档中定义)发送到Web服务器,并以CSV或JSON文件格式接收数据。这要求库是在Python中制作HTTP请求的标准。最后,可以将数据加载到熊猫(见2个例子)。
在简单的情况下,您可以直接将CSV文件从网站加载到熊猫pd.read_csv()通过将URL作为字符串传递给filepath_or_buffer =。
df = pd.read_csv(“https://.../players.csv”)
和pd.read_html ()您可以通过将URL传递到网站的所有表io =。
df_list = pd.read_html(io =“https:// ......”)
注意pd.read_html ()返回dataframes列表。
如何将数据集加载到Pandas DataFrames中的SQL数据库
您可以从SQL数据库中读取表sqlite.那mysql.那PostgreSQL.,更多pd.read_sql()。
df = pd.read_sql(SQL =“SQL查询”,CON = Connection)
这SQL.参数需要SQL语言中的SQL查询。在从数据库中提取数据之前,必须创建与数据库的连接,并将连接对象传递给参数con。
根据您选择的数据库系统,您也必须安装和导入Python库sqlite3或者SQLAlchemy要创建连接(查看具有SQLite的示例)。
如何从其他Dataframe和Pandas系列创建新的熊猫Dataframe
许多工作流程从现有的DataFrame和Series创建新的Dataframe:过滤,聚合,操作,合并,加入,连接等。让我展示两个例子:
- 过滤DataFrames.
让我们过滤播放器DataFrameDF.并创建一个新的dataframe高只有那些高于1.75米的球员:
高= df [df.height_m> 1.75] .copy()高
在使用时避免任何问题高和DF.,链式复制()方法。这在内存中创建并保存了独立于原始DataFrame的内存中的新数据帧对象。
- 将Pandas系列转换为DataFrame
在选择DataFrame的一列(例如,“GoALS_2019”)时,Pandas创建了一个熊猫系列。让我们创建“目标”系列:
目标= df.goars_2019.Copy()目标
PANDAS系列是一维标记阵列。DataFrame对象和系列对象的行为类似地并分享许多方法。但它们并不相同。有时,使用该方法将串联转换为DataFrame是有益的to_frame()。
GOALAS = GOALS.TO_FRAME()目标
结论
您可以使用多种方式创建Pandas DataFrame。您必须回答的第一个也是最重要的问题是:来自哪里的数据来自哪里?知道数据源后,您可以选择将数据加载到熊猫的适当工具。下表提供了概述: