pandas基础入门篇学习手册

試著忘記壹切 提交于 2019-11-26 16:55:38
from pandas import Series, DataFrame
import pandas as pd

Series

Series是pandas的基本数据类型,包含一个数组的数据(任何NumPy的数据类型)和一个与数组关联的数据标签,也称为索引

ses = Series( list(range(15,18) ) )
ses  #左边为索引一列为默认索引,右边一列为值
0    15
1    16
2    17
dtype: int64

读取ses的索引和值

ses.index
RangeIndex(start=0, stop=3, step=1)
ses.values
array([15, 16, 17], dtype=int64)

也可以指明其索引进行记性创建

ses1 = Series(list(range(15,20)),index=["a", "b", "c", "d", "e"])
ses1
a    15
b    16
c    17
d    18
e    19
dtype: int64

series 更像是一个字典,可以使用索引-值的形式进行访问

"a" in ses1
True
ses1["a"]
15

也可以通过字典创建series

dic = {"e":1, "f":10}
ses2 = Series(dic)
ses2
e     1
f    10
dtype: int64

dataFrame

一个Datarame表示一个表格,类似电子表格的数据结构,包含一个经过排序的列表集,它们每一个都可以有不同的类型值(数字,字符串,布尔等等)。Datarame有行和列的索引;它可以被看作是一个Series的字典(每个Series共享一个索引)。在DataFrame里的面向行和面向列的操作大致是对称的。在底层,数据是作为一个或多个二维数组存储的,而不是列表,字典,或其它一维的数组集合。

同样dataFrame可以以字典的形式创建

dic = {"country":["China", "USA", "japan"],"grade":[78,56,95]}
df1 = DataFrame(dic)
df1
country grade
0 China 78
1 USA 56
2 japan 95

也可以用通过列的顺序,指定列的位置

df2 = DataFrame(dic, columns=["grade","country"],index=["xiaoming","dahuang","bob"])
df2
grade country
xiaoming 78 China
dahuang 56 USA
bob 95 japan

dataFrame值的访问

  • 使用iloc访问行, i值行号,不是值index的名字
df2.iloc[0]
grade         78
country    China
Name: xiaoming, dtype: object
  • 两种形式访问列
df2["grade"]
xiaoming    78
dahuang     56
bob         95
Name: grade, dtype: int64
df2.grade
xiaoming    78
dahuang     56
bob         95
Name: grade, dtype: int64

创建新的列和删除

  • 给一个不存在的列赋值会创建一个新的列,和字典一样del关键字将会删除列
df2["age"] = [23,25,27]
df2
grade country age
xiaoming 78 China 23
dahuang 56 USA 25
bob 95 japan 27
del df2["age"]
df2
grade country
xiaoming 78 China
dahuang 56 USA
bob 95 japan
df2["age"] = [23,25,27]

访问行列索引和数据

  • 访问列索引
df2.columns
Index(['grade', 'country', 'age'], dtype='object')
  • 访问行索引
df2.index
Index(['xiaoming', 'dahuang', 'bob'], dtype='object')
  • 访问数值,数值为一个numpy的array类型
df2.values
array([[78, 'China', 23],
       [56, 'USA', 25],
       [95, 'japan', 27]], dtype=object)

访问和修改dataframe的某些值

  • dataframe修改或者查看某个值, loc 括号里面使用索引, iloc括号里面使用行列号
df2.loc["bob"]["country"]
'japan'
df2.iloc[2,1]
'japan'
  • 访问一些连续列,行类似
df2.loc[:,"grade":"country"]
grade country
xiaoming 78 China
dahuang 56 USA
bob 95 japan
  • 访问一定行数 和列数的数据 两个坐标写在同一个中括号里,用逗号隔开
df2.iloc[0:2,1:3]
country age
xiaoming China 23
dahuang USA 25
  • 修改列名 ,索引修改方式相同
df2
grade country age
xiaoming 78 China 23
dahuang 56 USA 25
bob 95 japan 27
df2.columns = ["分数","国家","年龄"]
df2
grade country age
xiaoming 78 China 23
dahuang 56 USA 25
bob 95 japan 27
  • 重排索引
df2.reindex(["bob", "dahuang","xiaoming"])
grade country age
bob 95 japan 27
dahuang 56 USA 25
xiaoming 78 China 23
  • 根据列条件,选择dataFrame数据框中的数据
df4 = DataFrame([[97,"japan",27],[56, "USA",25],[78,"asf",37]],index=["cyf","lyl","dw"], columns=["分数","国家","年龄"])
df4
分数 国家 年龄
cyf 97 japan 27
lyl 56 USA 25
dw 78 asf 37
df5 = pd.concat([df2,df4],axis =0 ) 
df5
分数 国家 年龄
xiaoming 78 China 23
dahuang 56 USA 25
bob 95 japan 27
cyf 97 japan 27
lyl 56 USA 25
dw 78 asf 37
  • 数据清洗drop()
#删除列为“分数”的列
df6 = df5.drop(["分数"],axis =1) 
df6
国家 年龄
xiaoming China 23
dahuang USA 25
bob japan 27
cyf japan 27
lyl USA 25
dw asf 37
  • 常用的返回一列的去重后的值
df6["年龄"].unique()
array([23, 25, 27, 37], dtype=int64)

关于pandas 读取文件和存储文件的使用说明

import pandas as pd
df1 = pd.read_excel("QA.xlsx",header = 0, usecols=["问题","分类"])
df1.head(1)
#读取excel 和CSV的参数基本一致,读取excel文件不需要指定sep分隔符 ,#其中header=0 表示将文件的第一行作为df1的列索引,当文件没有列名的时候,
#应设置为header=None, usercols 表示使用"问题","分类"两列
#也可以设置为[0,3],表示第1和第4列
问题 分类
0 question l

写CSV文件上

df1.to_csv("QAtemp.csv",sep = '\t',index =False,header = False,encoding = "utf8" )
#index = False 表示CSV中,不储存行索引,header=False 表示不存储列索引,默认都存储,endcoding最好指定下utf8编码
#一般这样存储的在window下是乱码,用记事本打开,另存为 选定utf-8 格式保存就行。

apply的用法

def get_len(df ,col):
    return len(df[col])

df1["length"]= df1.apply(get_len,axis=1,args=('问题'))
print(df1['length'])
---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-57-c2d0fbd2bc67> in <module>
      2     return len(df[col])
      3 
----> 4 df1["length"]= df1.apply(get_len,axis=1,args=('问题'))
      5 print(df1['length'])


~\AppData\Local\Continuum\anaconda3\envs\py36\lib\site-packages\pandas\core\frame.py in apply(self, func, axis, broadcast, raw, reduce, result_type, args, **kwds)
   6485                          args=args,
   6486                          kwds=kwds)
-> 6487         return op.get_result()
   6488 
   6489     def applymap(self, func):


~\AppData\Local\Continuum\anaconda3\envs\py36\lib\site-packages\pandas\core\apply.py in get_result(self)
    149             return self.apply_raw()
    150 
--> 151         return self.apply_standard()
    152 
    153     def apply_empty_result(self):


~\AppData\Local\Continuum\anaconda3\envs\py36\lib\site-packages\pandas\core\apply.py in apply_standard(self)
    255 
    256         # compute the result using the series generator
--> 257         self.apply_series_generator()
    258 
    259         # wrap results


~\AppData\Local\Continuum\anaconda3\envs\py36\lib\site-packages\pandas\core\apply.py in apply_series_generator(self)
    284             try:
    285                 for i, v in enumerate(series_gen):
--> 286                     results[i] = self.f(v)
    287                     keys.append(v.name)
    288             except Exception as e:


~\AppData\Local\Continuum\anaconda3\envs\py36\lib\site-packages\pandas\core\apply.py in f(x)
     76 
     77             def f(x):
---> 78                 return func(x, *args, **kwds)
     79         else:
     80             f = func


TypeError: ('get_len() takes 2 positional arguments but 3 were given', 'occurred at index 0')

报错原因,参数解析的时候 将"问题解析为了两个参数"

#查看df1的列名
df1.columns
Index(['问题', '分类'], dtype='object')
#重新赋值
df1.columns=["q","l"]
df1.columns
Index(['q', 'l'], dtype='object')
def get_len(df ,col):
    return len(df[col])

df1["length"]= df1.apply(get_len,axis=1,args=('q'))
print(df1['length'][:3])
0     8
1    11
2     8
Name: length, dtype: int64

此时就不报错了,所以尽量列名都重新设置为英文的,少出问题

  • 以上的apply的用法是对dataframe的某一列进行操作,以函数get_len 作为参数,传递给apply,其中参数函数的的第一个参数是需要操作的datafame,其他参数是需要用的参数,在调用时,在apply的args参数中,按顺序赋值,axis=1表示列操作,axis=0表示行操作。
def get_len(df ,col):
    return len(df[col])

df1["length"]= df1.apply(get_len,axis=1,args=('q'))
print(df1['length'][:3])
0     8
1    11
2     8
Name: length, dtype: int64

行求和与列求和

import pandas as pd
arr = [[1,2],[3,4],[5,6]]
df = pd.DataFrame(arr,index =["a","b","c"], columns = ["d","e"])
df
d e
a 1 2
b 3 4
c 5 6
求第一行的和
df.iloc[0,:].sum()
3
求第2列的和
df.iloc[:,1].sum()
12
求第二列前两个数的和
df.iloc[0:2,1].sum()
6
求每一列的和
df.apply(sum)
d     9
e    12
dtype: int64
求每行的和
df.apply(sum,axis = 1)
a     3
b     7
c    11
dtype: int64

测试 两个pandas直接相加的结果

import pandas as pd
import numpy as np
df1 =pd.DataFrame(np.random.randn(2,3) ,columns = ["a","b","c"])
df1
a b c
0 -1.062560 -0.214433 -0.214482
1 1.700706 -0.397218 0.023313
df2 = pd.DataFrame(np.random.randn(2,3),columns = ["a","b","c"])
df2
a b c
0 0.069632 0.672244 0.790270
1 1.264967 -0.155815 -0.565916
print(df1+df2)
          a         b         c
0 -0.992928  0.457811  0.575788
1  2.965673 -0.553032 -0.542603
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!