pandas两种主要的数据结构:Series和DataFrame
Series:类似于一维数组的对象,由一组数据以及一组与之相关的数据标签(即索引)组成。Series中的索引值可以重复
DataFrame:一个表格型的数据结构,包含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型等),DataFrame即有行索引也有列索引,可以被看成是Series组成的字典
1. Seriess
通过一维数组创建:
arr = np.array([1,2,3,4,np.NaN])
series1 = Series(arr)
自定义Series索引:
series2 = Series([90,80,85])
series2.index = [u'语文',u'数学',u'英语']
print(series2)
series2 = Series([90,80,70],index=[u'语文',u'数学',u'英语'])
print(series2)
RangeIndex(start=0, stop=5, step=1)
语文 90
数学 80
英语 85
通过字典方式创建,key重复会被后面的覆盖:
dict1 = {'一':100,'二':200,'三':300,'一':500}
series3 = Series(dict1)
print(series3)
print(series3.index)
print(series3.values)
print(series3.dtype)
一 500
三 300
二 200
dtype: int64
Index([u'一', u'三', u'二'], dtype='object')
[500 300 200]
int64
Series索引可以重复:
series4 = Series([90,80,70,100])
series4.index = [u'一',u'二',u'三',u'一']
print(series4)
print(series4[u'一'])
一 90
二 80
三 70
一 100
dtype: int64
一 90
一 100
dtype: int64
Series的运算
series = Series({'101': -100,'102':200,'103': 300})
print(series)
print(series > 100)
print(series / 100)
print(np.fabs(series))
print(np.exp(series))
101 -100
102 200
103 300
dtype: int64
101 False
102 True
103 True
dtype: bool
101 -1.0
102 2.0
103 3.0
dtype: float64
101 100.0
102 200.0
103 300.0
dtype: float64
101 3.720076e-44
102 7.225974e+86
103 1.942426e+130
dtype: float64
Series缺失值检测
scores = Series({'a':90,'b':80,'c':95})
new = ['a','b','cc','c','d']
scores1 = Series(scores,index=new)
print scores1
print(pd.isnull(scores1))
print(scores1[pd.isnull(scores1)])
print(scores1[pd.notnull(scores1)])
a 90.0
b 80.0
cc NaN
c 95.0
d NaN
dtype: float64
a False
b False
cc True
c False
d True
dtype: bool
cc NaN
d NaN
dtype: float64
a 90.0
b 80.0
c 95.0
dtype: float64
Series自动对齐,在进行运算时会自动匹配相同的索引进行运算
s1 = Series([1,2,3],index=['p1','p2','p3'])
s2 = Series([4,5,6,7],index=['p2','p3','p4','p5'])
print(s1+s2)
p1 NaN
p2 6.0
p3 8.0
p4 NaN
p5 NaN
dtype: float64
2. DataFrame
通过二维数组创建:
df = DataFrame([['a','b','c','d'],[1,2,3,4]])
print(df)
0 1 2 3
0 a b c d
1 1 2 3 4
arr = np.array([
[1,2,3,4],
[2,3,4,5],
[3,4,5,6]
])
df = DataFrame(arr,index=['one','two','three'],columns=['a','b','c','d']) #index是行索引,columns是列索引
print(df)
print(df.values)
a b c d
one 1 2 3 4
two 2 3 4 5
three 3 4 5 6
[[1 2 3 4]
[2 3 4 5]
[3 4 5 6]]
通过字典方式创建:
dict1 = {
'a': ['100','101','102'],
'b': ['1','2','3'],
'year': ['2019','2018','2017'],
'month': '06'
}
df = DataFrame(dict1) #字典形式创建的DataFrame,key会做为列索引
df.index = ['one','two','three']
print(df)
a b month year
one 100 1 06 2019
two 101 2 06 2018
three 102 3 06 2017
DataFrame数据获取:
可以直接通过列索引获取指定列的数据 df[column_name]
通过ix方法来获取对应行索引的行数据 df.ix[index_name]
dataframe删除原来行索引,重新建立从0开始的索引:
df.reset_index(drop=True)
按指定列排序 dataframe sort_values
升序:
df.sort_values(by="sales" ) by 指定列
降序:
df.sort_values(by="sales" , ascending=False) by 指定列
遍历dataframe:
for index, row in oneTweetDf.iterrows():
if index == 0:
lineData = row.tolist()
else:
lineData.extend([row["CrwalTime"], row["Like"], row["Transfer"], row["Comment"]])
3. pandas基本功能
3.1.读写文件
读文件常用的方法是read_csv
df = pd.read_csv("C:/Users/ADMIN/Desktop/data.txt",sep=";",header=None) #header=None,第一行数据不作为索引 print(df) 0 1 2 3 4 0 gerry 18 90 95 96.0 1 tom 20 92 94 NaN 2 lili 21 98 97 96.0
写文件 writer
file = codecs.open(fileName, 'wb', "utf_8_sig") csv_writer = csv.writer(finaFile) #写一行 csv_writer .writerow(header) #写多行 csv_writer.writerows(datas)
3.2.索引、选取和数据过滤
pandas数据过滤
columns = ['name','age',u'语文',u'数学',u'英语']
df.columns = columns
print(df)
print(df[columns[2:]])
name age 语文 数学 英语
0 gerry 18 90 95 96.0
1 tom 20 92 94 NaN
2 lili 21 98 97 96.0
语文 数学 英语
0 90 95 96.0
1 92 94 NaN
2 98 97 96.0
删除NaN的行
print(df.dropna()) #删除整行包含nan值的行数据
print(df.dropna(how="all")) #删除整行全是nan值的行数据
填充数据fillna
df = DataFrame(np.random.randn(7,3))
df.ix[:4,1] = np.nan
df.ix[:2,2] = np.nan
print(df)
print(df.fillna(0)) #填充所有nan
print(df.fillna({1:1,2:2})) #按列进行填充
0 1 2
0 -1.181993 NaN NaN
1 -1.537796 NaN NaN
2 -0.334437 NaN NaN
3 -0.629362 NaN 1.336971
4 -0.476075 NaN 1.410920
5 0.661803 1.926648 1.311989
6 0.160683 0.294160 -0.341011
0 1 2
0 -1.181993 0.000000 0.000000
1 -1.537796 0.000000 0.000000
2 -0.334437 0.000000 0.000000
3 -0.629362 0.000000 1.336971
4 -0.476075 0.000000 1.410920
5 0.661803 1.926648 1.311989
6 0.160683 0.294160 -0.341011
0 1 2
0 -1.181993 1.000000 2.000000
1 -1.537796 1.000000 2.000000
2 -0.334437 1.000000 2.000000
3 -0.629362 1.000000 1.336971
4 -0.476075 1.000000 1.410920
5 0.661803 1.926648 1.311989
6 0.160683 0.294160 -0.341011
3.3.算法运算和数据对齐
常用的数据统计方法:
相关系数与协方差:
df = DataFrame({
"GDP":[12,23,34,20,30],
"air_temperture": [26,27,30,28,29],
"year": ['2001','2002','2003','2004','2005']
})
print(df)
print u"相关系数:\n",df.corr()
print u"协方差:\n", df.cov()
print df['GDP'].corr(df['air_temperture'])
print df['GDP'].cov(df['air_temperture'])
pandas唯一值、值计数以及成员资格
ser = Series(['a','b','c','d','a','b'])
print(ser)
print ser.unique() #去重
print ser.value_counts() #计数,默认按值出现频率降序排列
mask = ser.isin(['b','c']) #判断每个元素是否为b或c
print mask
print(ser[mask])
0 a
1 b
2 c
3 d
4 a
5 b
dtype: object
['a' 'b' 'c' 'd']
b 2
a 2
d 1
c 1
dtype: int64
0 False
1 True
2 True
3 False
4 False
5 True
dtype: bool
1 b
2 c
5 b
dtype: object
pandas层次索引
df = DataFrame({
'year': [2005,2005,2006,2006,2007],
'fruit': ['apple','banana','apple','banana','apple'],
'production': [2000,2500,3000,2400,3200],
'profits': [100,150,200,300,210]
})
df = df.set_index(['year','fruit'])
print(df)
production profits
year fruit
2005 apple 2000 100
banana 2500 150
2006 apple 3000 200
banana 2400 300
2007 apple 3200 210
print df.ix[2005,'apple']
production 2000
profits 100
按层次化索引进行数据统计
print df.sum(level='year')
print df.mean(level='fruit')
print df.min(level=['fruit'])
production profits
year
2005 4500 250
2006 5400 500
2007 3200 210
production profits
fruit
apple 2733.333333 170.0
banana 2450.000000 225.0
production profits
fruit
apple 2000 100
banana 2400 150