十分钟入门pandas(中)【解读pandas官方文档】

浏览: 4761

接着前文继续

前文传送门: https://ask.hellobi.com/blog/wangdawei/8683

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df

Clipboard Image.png

缺失值处理

pandas主要使用值np.nan来表示丢失的数据。 默认情况下不包括在计算中。 请参阅缺少数据部分:http://pandas.pydata.org/pandas-docs/version/0.20/missing_data.html#missing-data

重新索引允许您更改/添加/删除指定轴上的索引。 这将返回数据的副本。

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])

df1.loc[dates[0]:dates[1],'E'] = 1

df1

Clipboard Image.png

注:增加了一个新列E,并且给E列第一行和第二行数据赋值为1,则没赋值的数据显示不存在。


删除存在缺失值的行:

df1.dropna(how='any')

Clipboard Image.png


填充缺失值:

df1.fillna(value=5)

Clipboard Image.png

注:这里使用5去填充,实际中,我们做数据分析常用0,中位数,平均数来填充。


查看空值数据:

pd.isnull(df1)

Clipboard Image.png

注:返回True的是空值数据


操作

请参阅二进制操作的基本部分:http://pandas.pydata.org/pandas-docs/version/0.20/basics.html#basics-binop


统计

操作中一般不包含丢失的数据

执行描述性统计:

df.mean() #求每列平均值

Clipboard Image.png

df.mean(1) #每行求平均值

Clipboard Image.png



Apply

将功能用于处理数据

df.apply(np.cumsum)

Clipboard Image.png

注:列累加,就是第二列的结果等于第一列加第二列数据,依次累加。


使用匿名函数求每列的最大值和最小值的差:

df.apply(lambda x: x.max() - x.min())

Clipboard Image.png


直方图化

直方图和离散化查看更多资料:http://pandas.pydata.org/pandas-docs/version/0.20/basics.html#basics-discretization

s = pd.Series(np.random.randint(0, 7, size=10))
s

Clipboard Image.png

注:在0-7中随机产生10个整数


s.value_counts()

注:对数据进行计数

Clipboard Image.png


操作字符串的方法

字符串方法

Series中配置了一组字符串处理方法,使其易于在数组的每个元素上进行操作,如下面的代码片段所示。请注意,str中的模式匹配通常默认使用正则表达式(在某些情况下始终使用它们)。 在矢量化字符串方法中查看更多:http://pandas.pydata.org/pandas-docs/version/0.20/text.html#text-string-methods

正则表达式:https://docs.python.org/2/library/re.html

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat']) 

注:创建一个Series

s.str.lower()

Clipboard Image.png

注:把其中所有的英文字母变成小写


合并

字符连接

合并操作更多内容:http://pandas.pydata.org/pandas-docs/version/0.20/merging.html#merging

将pandas对象用concat()连接在一起

df = pd.DataFrame(np.random.randn(10, 4))
df

Clipboard Image.png

注:产生一个10行4列的标准正态分布

pieces = [df[:3], df[3:7], df[7:]]
pieces

Clipboard Image.png

注:切成三块

pd.concat(pieces)

Clipboard Image.png

注:将碎块合并

join加入操作

SQL风格合并。 请参阅数据库风格加入:http://pandas.pydata.org/pandas-docs/version/0.20/merging.html#merging-join

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
left

Clipboard Image.png

right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
right

Clipboard Image.png

注:使用dict的方式创建两个dataframe

pd.merge(left, right, on='key')

Clipboard Image.png

注:连接之后的效果如上图,有点像笛卡尔积操作。


另外举个例子:

left = pd.DataFrame({'key': ['foo', 'bar'], 'lval': [1, 2]})
left

Clipboard Image.png

right = pd.DataFrame({'key': ['foo', 'bar'], 'rval': [4, 5]})
right

Clipboard Image.png

pd.merge(left, right, on='key')

Clipboard Image.png

Append

给dataframe添加行,参考http://pandas.pydata.org/pandas-docs/version/0.20/merging.html#merging-concatenation

df = pd.DataFrame(np.random.randn(8, 4), columns=['A','B','C','D'])
df

Clipboard Image.png

s = df.iloc[3]
df.append(s, ignore_index=True)

Clipboard Image.png

注:将第三行复制一份添加到了最后一行(增加了一行)


分组

通过“group by”,我们指的是涉及一个或多个以下步骤的过程:

1.根据一些标准将数据分成组

2.将功能独立应用于每个组

3.将结果合并成数据结构

更多内容参考:http://pandas.pydata.org/pandas-docs/version/0.20/groupby.html#groupby

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three',
'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)})
df

Clipboard Image.png

注:生成了一个数据框

分组,然后对结果组应用函数求和:

df.groupby('A').sum()

Clipboard Image.png

注:通过A列中的数据分组,A列中只有bar和foo,所以分为两组,求和时候因为只有C/D列是数字,所以只应用在C/D列上求和


按多个列分组形成一个分层索引,然后我们应用函数:

df.groupby(['A','B']).sum()

Clipboard Image.png

注:相当于在根据A列分组的基础上在B列细分,再求和


资料重塑

请参阅有关分层索引和资料重塑的部分:

http://pandas.pydata.org/pandas-docs/version/0.20/advanced.html#advanced-hierarchical

http://pandas.pydata.org/pandas-docs/version/0.20/reshaping.html#reshaping-stacking


Stack堆

tuples = list(zip(*[['bar', 'bar', 'baz', 'baz',
'foo', 'foo', 'qux', 'qux'],
['one', 'two', 'one', 'two',
'one', 'two', 'one', 'two']]))
tuples

Clipboard Image.png

注:创建了一个list,并且用zip方法整合合并成内部是tuple形式

index = pd.MultiIndex.from_tuples(tuples, names=['first', 'second'])
index

Clipboard Image.png

注:将数据转为MultiIndex结构,即从字面上理解为多索引结构


df = pd.DataFrame(np.random.randn(8, 2), index=index, columns=['A', 'B'])
df

Clipboard Image.png

df2 = df[:4]

注:取出前四行数据


stack()方法“压缩”DataFrame的列。

stacked = df2.stack()
stacked

Clipboard Image.png

注:说实话,这个我也没看懂。。

使用“堆叠”DataFrame或Series(具有MultiIndex作为索引),stack()的反向操作是unpack(),它默认情况下解除最后一个级别


unstack会默认多层索引的series转变为DataFrame

stacked.unstack()

Clipboard Image.png


stacked.unstack(1)

Clipboard Image.png


stacked.unstack(0)

Clipboard Image.png

通过level指定操作索引的级别

未完待续~~~~~~~~~~~~~

推荐 2
本文由 ID王大伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

这个系列很可以。
老师,从结果来看,df.apply(np.cumsum)不是对行累加吗
喜欢看连载哈哈

要回复文章请先登录注册