0
点赞
收藏
分享

微信扫一扫

学习Python之pandas


学习Python之pandas


Series和 DataFrame。


一维数组的对象,它由一组数据(各种NumPy数据类型)以及一组与之相关的数据标签(即索引)组成。 列如



学习Python之pandas_数据分析


Series的字符串表现形式为:索引在左边,值在右边。由于我们没有为数据指定索引,于是会自动创建一个0到N-1(N为数据的长度)的整数型索引


 


表格型的数据结构,它含有 一组有序的列,每列可以是不同的值类型(数值、字符串、布尔值等)。DataFrame既有行索引也有列索引,可以被看做由Series组成的字典(共用同一个索引),且DataFrame中面向行和列的操作基本上是平衡的。其实,DataFrame中数据是以一个或多个二维块存放的(而不是列表、字典或别的一维数据结构)。通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series。


 


基本功能


 


数据加载、存储与文件格式--pandas输入输出对象


  输入输出通常可以划分为几个大类:1.读取文本文件和其他更高效的磁盘存储格式    2.加载数据库中的数据    3.利用Web API操作网络资源。


  关于读写文本格式的数据,pandas提供了一些用于将表格型数据读取为DataFrame对象的函数。类型推断(type inference)是这些函数中最重要的功能之一:不需要指定列的类型到底是数值、整数、布尔值,还是字符串。日期和其他自定义类型的处理需要多花点功夫才行。


 

学习Python之pandas_数据分析_02


这些函数的选项可以划分为一下几个大类:


索引:将一个或者多个列当做返回的DataFrame处理,以及是否从文件、用户获取列名。


类型推断和数据转换:包括用户定义值的转换、缺失值标记列表等。


日期解析:包括组合功能,比如将分散在多个列中的日期时间信息组合成结果中的单个列。


迭代:支持对大文件进行逐块迭代。


不规整数据问题:跳过一些行、页脚、注释或其他一些不重要的东西(比如由成千上万个逗号隔开的数值数据)。


 


逗号分隔值 (Comma-Separated Values, CSV ,有时也称为 字符分隔值 ,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符 序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成, 记录间以某种换行符分隔 ;每条记录由 ​​字段​​​ 组成, 字段间的分隔符是其它字符或字符串,最常见的是逗号或​​制表符​​​ 。通常,所有记录都有完全相同的字段序列。规则: 1 开头是不留空,以行为单位。 2 可含或不含列名,含列名则居文件第一行。 3 一行数据不跨行,无空行。 4 以 ​​​半角​​ 逗号(即,)作分隔符,列为空也要表达其存在。 5列内容如存在半角引号(即"),替换成半角双引号("")转义,即用半角引号(即"")将该字段值包含起来。 6文件读写时引号,逗号操作规则互逆。 7内码格式不限,可为 ASCII、Unicode 或者其他。 8不支持特殊字符。用Excel和notepad++打开以逗号分隔的(CSV)文本文件如下图,使用read_csv将其读入一个DataFrame中,也可使用read_table(需要指定分隔符)。


 



学习Python之pandas_数据分析_03

学习Python之pandas_字符串_04

学习Python之pandas_数据分析_05


 


通过类似字典标记的方式或属性的方式,可以将DataFrame的列获取为一个Series,返回的Series拥有原DataFrame相同的索引,且其name属性也已经被相应地设置好了。



学习Python之pandas_半角_06

学习Python之pandas_数据_07

学习Python之pandas_字符串_08

学习Python之pandas_数据_09

学习Python之pandas_python_10


 


 


 



学习Python之pandas_数据_11


 


 


 


 


数据聚合与分组


《利用Python进行数据分析》主要目标:


根据一个或多个键(可以是函数、数组或DataFrame列名)拆分pandas对象


计算分组摘要统计,如计数、平均值、标准差,或用户自定义函数


对DataFrame的列应用各种各样的函数


应用组内转换或其他运算,如规格化、线性回归、排名或选取子集等。


计算透视表或交叉表


执行分位数分析以及其他分组分析


 


GroupBy技术


拆分-应用-合并:pandas对象中的数据根据一个或多个键拆分为多组(拆分操作是在对象的特定轴上执行),将函数应用到各个分组并产生一个新值。所有这些函数的执行结果会被合并到最终的结果对象中。



学习Python之pandas_python_12


分组键可以有多种形式,且类型不必相同:1.列表或数组,其长度与待分组的轴一样 2.表示DataFrame某个列名的值 3.字典或Series,给出待分组的轴上的值与分组名之间的对应关系。 4.函数,用于处理轴索引或索引中的各个标签。


 


df = DataFrame({'key1':['a','a','b','b','a'],
                'key2':['one', 'two', 'one', 'two', 'one'],
                'data1':np.random.randn(5),
                'data2':np.random.randn(5)})


这种创建DataFrame的方式,需要学习一下
print(df)
print(type(df))  


下面是df的数据:


      data1     data2 key1 key2
0 -0.055054 -0.458374    a  one
1 -0.323584  0.946005    a  two
2  1.516328  0.936339    b  one
3 -1.519715 -1.533189    b  two
4 -0.014481  0.850569    a  one


df的类型:<class 'pandas.core.frame.DataFrame'>


 


grouped = df['data1'].groupby(df['key1'])  #访问data1,并根据key1调用groupby,即根据key1键值拆分data1数据
print(grouped)


grouped的类型:<pandas.core.groupby.SeriesGroupBy object at 0x0000024D328BF550>


变量grouped是一个GroupBy对象,含有一些有关分组键df['key1']的中间数据,可以执行相应的运算。


 


print(grouped.mean(), type(grouped.mean()))   #调用GroupBy的mean方法来计算分组平均值
print(grouped.sum(), type(grouped.sum()))     #调用GroupBy的sum方法来计算分组总和


key1
a    0.853492
b    0.524968
Name: data1, dtype: float64 <class 'pandas.core.series.Series'>
key1
a    2.560475
b    1.049936
Name: data1, dtype: float64 <class 'pandas.core.series.Series'>
数据(Series)根据分组键进行聚合,产生了新的Series,其索引为key1列中的唯一值。聚合后的grouped.mean(),grouped.sum()的类型都是pandas.core.series.Series类型。


 


根据两个键拆分数据:


print(df['data1'].groupby([df['key1'], df['key2']]))  #<pandas.core.groupby.SeriesGroupBy object at 0x0000024D33F5EF60>
print(type(df['data1'].groupby([df['key1'], df['key2']])))  #<class 'pandas.core.groupby.SeriesGroupBy'>


同样也是GroupBy对象,对该对象调用方法聚合:


means = df['data1'].groupby([df['key1'],df['key2']]).mean()


print(means,type(means))


key1  key2
a     one     0.530798
      two     0.952727
b     one     0.223984
      two    -1.837967
Name: data1, dtype: float64 <class 'pandas.core.series.Series'>


这里对于pandas.core.series.Series类型,所能进行的运算要深究一下


 


means.unstack() #通过两个键对数据进行分组,得到的Series具有一个层次化索引(由唯一的键对组成)


key2

one

two

key1

 

 

a

-0.145635

1.604870

b

0.141158

-0.389688


print(type(means.unstack()))


<class 'pandas.core.frame.DataFrame'>


means.unstack()是pandas.core.frame.DataFrame类型。


 


分组键可以是任何长度适当的数组:


states = np.array(['Ohio', 'California', 'California', 'Ohio', 'Ohio'])
years = np.array([2005, 2005, 2006, 2005, 2006])
df['data1'].groupby([states, years]).mean()


 


可以将列名(可以是字符串、数字或其他Python对象)用作分组键:


df.groupby('key1').mean()


         data1     data2
key1                   
a     0.623910  0.231532
b    -0.687893  1.154825


结果中没有key2列,这是因为df['key2']不是数值数据(俗称“麻烦列”),所以被从结果中排除。


 


df.groupby(['key1','key2']).mean()


              data1     data2
key1 key2                   
a    one   0.191249  1.584608
     two   0.661510 -0.509293
b    one   1.064954 -1.883186
     two  -0.111830  3.016565


这个不是很明白


 


对分组进行迭代


df.groupby('key1') #<pandas.core.groupby.DataFrameGroupBy object at 0x0000024D32AA5860>


df.groupby('key1').size() #type(df.groupby('key1').size()) pandas.core.series.Series


key1
a    3
b    2
dtype: int64


 


 


for name, group in df.groupby('key1'):
    print(name)
    print(group,type(group))


a
      data1     data2 key1 key2
0  1.534342  0.421469    a  one
1  1.094205  1.118537    a  two
4 -1.251446  0.244333    a  one
b
      data1     data2 key1 key2
2  0.202306  0.121816    b  one
3  1.098226 -0.969226    b  two


df原始数据:


      data1     data2 key1 key2
0  1.534342  0.421469    a  one
1  1.094205  1.118537    a  two
2  0.202306  0.121816    b  one
3  1.098226 -0.969226    b  two
4 -1.251446  0.244333    a  one


上述代码对key1键下的值作遴选,将同类分别挑出。group为pandas.core.frame.DataFrame类型。


对于多重键的情况,元组的第一个元素将会是由键值组成的元组:


for (k1, k2), group in df.groupby(['key1','key2']):
    print(k1, k2)
    print(group)


a one
      data1     data2 key1 key2
0 -0.061694 -0.900829    a  one
4  0.634587 -1.077740    a  one
a two
      data1     data2 key1 key2
1  0.457454  0.811768    a  two
b one
      data1     data2 key1 key2
2 -0.798543 -1.892609    b  one
b two
      data1     data2 key1 key2
3  1.023698 -0.995747    b  two
groupby同样为pandas.core.frame.DataFrame类型。


 

举报

相关推荐

0 条评论