pandas文档翻译——10分钟介绍pandas

楼主
我是社区第822297位番薯,欢迎点我头像关注我哦~

译者语:这是pandas用户手册的第一部分,在所谓的10分钟里(因为10分钟根本看不完)重点介绍了pandas的强大能力。

这是一个面向初学者的简短介绍,你可以在cookbook中查看更多复杂的技巧操作。

源自简道云用户龙小马先生

import numpy as np
 import pandas as pd
pandas对象创建
具体数据结构可以参考数据结构介绍部分。
通过传递一个数值列表我们创建一个series,它会自动创建一个整型索引:
s = pd.Series([1, 3, 5, np.nan, 6, 8])
 s

我们传递一个numpy数组来创建一个DataFrame,并给它一个日期型索引和标签列:

dates = pd.date_range("20130101", periods=6)
 dates
 df = pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list("ABCD"))
 df

我们传递一个字典来创建一个DataFrame

df2 = pd.DataFrame(
    {
        'A':1.0,
        'B':pd.Timestamp('20210101'),
        'C':pd.Series(1,index=range(4),dtype='float32'),
        'D':np.array([3]*4,dtype='int32'),
        'E':pd.Categorical(['test','train','test','train']),
        'F':'foo'
    }
 )
 df2

这个DataFrame的列具有不同的数据类型

如果你在使用IPython,那么我们可以使用tab来进行列名或者方法名的自动补全。(当然如果我们使用jupyter notebook或者其他python编辑器,那么一般都是有代码自动补全功能的。我用的是jupyter notebook)

查看数据

详情查看基础知识部分
我们可以通过下面的方法来查看最前或最后的数据:


展示索引和列名:

可以使用describe()方法来展示DataFrame的快速统计摘要,其中包括行计数、平均值、标准差:

可以这样来对数据进行转置

可以对列名称进行排序

可以对列中的值进行排序


选择数据

我们推荐使用.loc、iloc、at、iat方法来选择数据

直接获取数据

我们可以通过以下方法选择单列,产生一个series,它等同于df.A
可以使用[]来对行进行切片
df[0:3] # 第0行到第2行,从第0行开始,不包含第3行。

通过标签值选择数据

通过标签值获取一行的值
df.loc[dates[0]]
通过标签值来获取多轴的值
df.loc[:,['A','B']]
通过标签切片来截取数据
df.loc['2013-01-01':'2013-01-03','A':'C']
获取一个标量值
df.loc['2013-01-02','C']
快速访问标量值

通过位置来获取数据

通过传递整数位置参数来获取数据
通过整数切片来获取数据
通过整数位置参数的列表来获取数据
对行进行切片
对列进行切片
获取标量值
快速获取标量值

逻辑索引(数据过滤)

通过单列的值来过滤数据
通过整个数据集进行条件过滤
通过.isin方法来过滤数据
df2 = df.loc[:]
df2['E'] = ['one','one','two','three','four','three']
df2
df2[df2['E'].isin(['one','four'])]

设置值

设置一个新列,它会自动根据索引值进行对齐
s1 = pd.Series(list(range(1,7)),index=pd.date_range('2013-01-02',periods=6))
s1
df['F'] = s1
df
通过标签名称、标签位置、分配一个array数组来设置值
df.at[dates[0],'A'] = 0
df.iat[0,1] = 0
df.loc[:,'D'] = np.array([5] * len(df))

通过条件过滤来设置值

df2 = df.loc[:]
df2[df2>0] = -df2

缺失值处理

在pandas中主要是使用np.nan来作为缺失值,缺失值默认不参与计算。
reindex方法可以帮我们来重建、增加、删除特定轴的索引。下面我们创建一个数据的副本
df1 = df.reindex(index=dates[:4],columns=list(df.columns) + ['E'])
df1.loc[:'2013-01-02','E'] = 1
df1

删除任意包含空值的行

df1.dropna(how='any') # axis 默认值为0,即表示行
df1.dropna(axis=1,how='any') # axis = 1 表示删除列

填充缺失值

判断是否是缺失值

df1.isna()

数据操作

统计计算

统计操作一般会过滤掉缺失值
描述性统计计算
df.mean() # 计算各列的平均值
df.mean(1) # 计算各列的平均值

可以使用shift()函数在特定轴上对数据进行移动。sub函数相当于减法df-s,通过axis的设置在选择在index还是column上进行减法操作,它会让每个值就与后面的数据集进行减法。

s = pd.Series([1,3,5,np.nan,6,8],index=dates).shift(2)
s

Apply函数

df.apply(np.cumsum) # 计算每列的移动累计值

计算每列最大值与最小值之差

字符串处理方法

series在str方法中打包了一系列的字符串处理方法,它可以操控数组中的每一个字符串元素。
例如,我们可以用str.lower()将字符的大写转换为小写

数据合并

concat 合并

pandas提供了多种多样的方法可以简单便捷地完成series、DataFrame的合并、连接操作。
使用concat()方法合并两个DataFrame

merge 连接

这是一种类似SQL中的join的方法
可以做如下笛卡尔积的连接
还可以进行如下左连接

groupby 分组

Group by分组包含以下的操作:
  • Splitting 根据条件对数据分割成组
  • Applying 分别给不同组应用不同函数
  • Combining 将结果组合成DataFrame
将数据按A列进行分组,并应用sum()函数操作
对多列进行分组,形成一个多层索引形式的数据格式,同样地,我们还是可以使用sum()函数

数据变形

stack 堆栈

我们创建一个多层索引的DataFrame,然后利用stack()方法,可以把多重索引的列转到行上,完成索引的列转行。
tupless = list(
    zip(*[["bar", "bar", "baz", "baz", "foo", "foo", "qux", "qux"],["one", "two", "one", "two", "one", "two", "one", "two"]])
)
index = pd.MultiIndex.from_tuples(tupless,names=['fisrt','second'])
df = pd.DataFrame(np.random.randn(8,2),index=index,columns=['A','B'])
df2 = df.iloc[:4]
df2
df2.stack()

stack()方法对应的逆操作是unstack(),它可以完成行转列的操作,将行索引转到列上。
df2.stack().unstack()
df2.stack().unstack(1)
df2.stack().unstack(0)

透视表

我们可以非常简单的使用pivot()方法来为DataFrame生成一个透视表
df = pd.DataFrame(
   .....:     {
   .....:         "A": ["one", "one", "two", "three"] * 3,
   .....:         "B": ["A", "B", "C"] * 4,
   .....:         "C": ["foo", "foo", "foo", "bar", "bar", "bar"] * 2,
   .....:         "D": np.random.randn(12),
   .....:         "E": np.random.randn(12),
   .....:     }
   .....: )
df
df.pivot(index=['A','B'],columns='C',values=['D'])

时间序列

Pandas具有非常简单、高效、强大的时间序列处理能力,可以在频次转换时执行重新抽样操作(例如,将秒级数据转换成5分钟频次的数据集)。这种操作在金融系统中非常常见,但pandas的能力远不止于此操作。
rng = pd.date_range('2012-01-01',periods=10,freq='S')
ts = pd.Series(np.random.randint(0,500,len(rng)),index=rng)
ts.resample('5min').sum()

时区处理

rng = pd.date_range('2012-03-06 00:00',periods=5,freq='M')
ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts.tz_localize('UTC') # 将日期时间转换为带时区的格式
ts.tz_localize('UTC').tz_convert('US/Eastern') # 将本地时区转换为US/Estern时区

转换时间类型

rng = pd.date_range('1/1/2012',periods=5,freq='M')
ts = pd.Series(np.random.randn(len(rng)),index=rng)
ts.to_period()
ts.to_period().to_timestamp()

可视化

matplotlib是Python的一个可视化包,我们默认使用如下语句来导入它
import matplotlib.pyplot as plt
plt.close('all')
ts = pd.Series(np.random.randn(1000),index=pd.date_range('1/1/2000',periods=1000))
ts = ts.cumsum()
ts.plot()

使用plt.plot()方法可以非常方便的为DataFrame所有列绘制条形图

df = pd.DataFrame(np.random.randn(10000,4),index=ts.index,columns=list('ABCD')) # 这里注意上面创建的ts的index,我修改了ts的总量为10000.
df = df.cumsum()
plt.figure()
df.plot()

导入导出数据

在正式文档中,这部分是靠前讲解的,不知在10分钟介绍里,放在了最后的位置
# 处理csv文件
df.to_csv('foo.csv') # 写入csv文件。注意写入的路径
pd.read_csv('foo.csv') # 读取csv文件。如果路径中包含特殊字符,可以使用r''

# 处理HDFS文件
df.to_hdf("foo.h5", "df") # 写入hdfs文件数据
pd.read_hdf("foo.h5", "df") # 读取hdfs文件数据

# 处理Excel文件
df.to_excel('foo.xlsx',sheet_name='Sheet1') # 写入Excel文件
pd.read_excel('foo.xlsx',sheet_name='Sheet1',index_col=None,na_values=['Na'])
分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表