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')
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 |
---|
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 |
---|
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)
写CSV文件上
df1.to_csv("QAtemp.csv",sep = '\t',index =False,header = False,encoding = "utf8" )
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.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
求第一行的和
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