本文主要内容:
- 重塑Pandas DataFrame
- Pandas DataFrame输出到文件
- 读取文件到Pandas DataFrame
重塑DataFrame对其进行转换,以便生成的结构使其更适合您的数据分析。换句话说,重塑并不是要关注格式化DataFrame中包含的值,而是更多地关注转换它的形状。
有多种重塑的方式:旋转、堆叠和拆分以及融解。
您可以使用该pivot()
函数从原始表中创建新的派生表。使用该函数时,可以传递三个参数:
values
:此参数指定在DataFrame数据中的结果。columns
:传递给此参数的数据将成为结果表中的列。index
:传递给此参数的数据将成为结果表中的索引。import pandas as pd
products = pd.DataFrame({'category': ['Cleaning', 'Cleaning', 'Entertainment', 'Entertainment', 'Tech', 'Tech'],
'store': ['Walmart', 'Dia', 'Walmart', 'Fnac', 'Dia','Walmart'],
'price': [11.42, 23.50, 19.99, 15.95, 55.75, 111.55],
'testscore': [4, 3, 5, 7, 5, 8]})
print("products:\n", products)
# 使用pivot()来旋转DataFrame
pivot_products = products.pivot(index='category', columns='store', values='price')
print("\npivot_products:\n", pivot_products)
运行后输出:
products:
category store price testscore
0 Cleaning Walmart 11.42 4
1 Cleaning Dia 23.50 3
2 Entertainment Walmart 19.99 5
3 Entertainment Fnac 15.95 7
4 Tech Dia 55.75 5
5 Tech Walmart 111.55 8
pivot_products:
store Dia Fnac Walmart
category
Cleaning 23.50 NaN 11.42
Entertainment NaN 15.95 19.99
Tech 55.75 NaN 111.55
如果没有传递参数values
,则将按多列进行转换。紧接着上面的示例在最后加上下面的代码:
# 使用pivot()来旋转DataFrame
pivot_products2 = products.pivot(index='category', columns='store')
print("\npivot_products2:\n", pivot_products2)
输出:
pivot_products2:
price testscore
store Dia Fnac Walmart Dia Fnac Walmart
category
Cleaning 23.50 NaN 11.42 3.0 NaN 4.0
Entertainment NaN 15.95 19.99 NaN 7.0 5.0
Tech 55.75 NaN 111.55 5.0 NaN 8.0
如果您的数据具有一个或多个作为列的标识符,而所有其他列都被视为测量变量,那么请使用melt函数。
这些测量变量都未转动到行轴,也就是说,当测量变量分布在DataFrame的宽度上时,melt()将确保它们将被放置在它的高度。或者,换句话说,您的DataFrame现在将变得更长而不是更宽。
因此,您有两个非标识符的列,即“变量”和“值”。
让我们用一个例子来说明这一点:
import pandas as pd
people = pd.DataFrame({'FirstName': ['John', 'Jane'],
'LastName': ['Doe', 'Austen'],
'BloodType': ['A-', 'B+'],
'Weight': [90, 64]})
print("people:\n", people)
# people DataFrame使用melt()函数
melt_people = pd.melt(people, id_vars=['FirstName', 'LastName'], var_name='measurements')
print("\nmelt_people:\n", melt_people)
输出:
people:
FirstName LastName BloodType Weight
0 John Doe A- 90
1 Jane Austen B+ 64
melt_people:
FirstName LastName measurements value
0 John Doe BloodType A-
1 Jane Austen BloodType B+
2 John Doe Weight 90
3 Jane Austen Weight 64
使用Pandas完成数据修改和操作后,您可能希望将DataFrame导出为其他格式。下面介绍两种输出DataFrame的方法:CSV、Excel文件。
要将DataFrame写入到CSV文件,可以使用to_csv()
:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['A', 'B', 'C'])
print(df, "\n")
df.to_csv('myDataFrame.csv')
运行后,在当前文件的目录中将会新建一个文件’myDataFrame.csv’,我们打开它,内容如下:
可以看到输出到CSV文件的数据看起来不并不是很直观,怎么办呢?
这段代码看起来很简单,但这也会是大家遇到困难的地方,因为会对数据输出有特定的要求。也许您不希望逗号作为分隔符,或者您想要指定特定的编码等。
别担心!您可以传递一些额外的参数,to_csv()
以确保您的数据以您希望的方式输出!
要通过指定字符分隔,请使用以下sep
参数:
df.to_csv('myDataFrame.csv', sep='\t')
此时再次运行程序,CSV文件的数据如下:
要使用特定的字符编码,可以使用以下encoding
参数:
df.to_csv('myDataFrame.csv', sep='\t', encoding='utf-8')
此外,您可以指定希望如何表示您的NaN
或缺少值、是否要输出标题、是否要写出行名称、是否要压缩等,在此处查看各个参数。
与将DataFrame输出为CSV文件所做的操作类似,可以使用to_excel()
将表编写到Excel。
需要先安装openpyxl模块:
pip install openpyxl
具体代码如下:
import numpy as np
import pandas as pd
df = pd.DataFrame(data=np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]),
columns=['A', 'B', 'C'])
writer = pd.ExcelWriter('myDataFrame.xlsx')
df.to_excel(writer, 'DataFrame')
writer.save()
运行后同样会在当前python文件的目录中新生成一个’myDataFrame.xlsx’文件,打开后内容如下:
另外还有很多额外的参数,如startcol
,startrow
等,若要满足更多输出数据的需求,请在此页面查阅完整参数。
该功能很简单,使用read_csv()函数即可,示例代码如下:
import pandas as pd
df = pd.read_csv('myDataFrame.csv')
print(df)
运行后输出如下:
发现生产的df对象,并不是我们所需要的。因此,我们在读取文件数据时需要设置相应的参数,下面我们来添加两个参数:
代码如下:
df = pd.read_csv('myDataFrame.csv', sep='\t', index_col=0)
再次运行后输出如下:
读取Excel与读取CSV文件类似,使用read_excel()函数即可,示例代码如下:
import pandas as pd
df = pd.read_excel('myDataFrame.xlsx')
print(df)
输出如下:
Unnamed: 0 A B C
0 0 1 2 3
1 1 4 5 6
2 2 7 8 9
同样,我们设置index_col
参数指定Dataframe的行索引。修改为:
df = pd.read_excel('myDataFrame.xlsx', index_col=0)
输出如下:
A B C
0 1 2 3
1 4 5 6
2 7 8 9
现在我们已经成功完成了操作数据所需的基本功能,另外对于Pandas数据分析包的其它语法大家可以到Pandas官方文档进行了解,后面我们将会有数据分析和机器学习的项目对其进行应用。
若有疑问,欢迎联系作者(微信:lixu1770105)。