import pandas as pd
from pandas import Series ,DataFrame
import numpy as np
from numpy import nan as NaN
一、新建DataFrame的方式
1、
list1 = [{'name':'小明','age':30},{'name':'小花','age':24}]
df3 = DataFrame(list1)
name age
0 小明 30
1 小花 24
pymongo 读取数据后可以直接转化为DataFrame处理
cursor = db[collection].find(query).limit(10)
# Expand the cursor and construct the DataFrame
df3 = pd.DataFrame(list(cursor))
2、通过字典建立
此外可以调用from_开头的类方法
dict2={"a":[1,2,3],"b":[4,5,6]}
#默认 a b 为colums 可以通过指定df7=pd.DataFrame.from_dict(dict2,orient="index") a 就变为index
df6=pd.DataFrame.from_dict(dict2)
a b
0 1 4
1 2 5
2 3 6
#指定索引
df2=DataFrame(dict1,columns=['year','Province','pop','debt'],index=['one','two','three','four'])
df3=pd.DataFrame(np.random.randint(0,10,(4,4)),index=[1,2,3,4],columns=['A','B','C','D'])
3、结构数组
arr=np.array([('item1',10),('item2',20),('item3',30),('item4',40)],dtype=[("name","10S"),("count",int)])
df5=pd.DataFrame(arr) df5
二、新建Series的方式
se1=Series([4,7,-2,8])
se2=Series([4,7,-2,8],index=['b','c','a','d'])
#字典建立,这时key 就变成index了
dict={"red":100,"black":400,"green":300,"pink":900}
se3=Series(dict)
black 400
green 300
pink 900
red 100
dtype: int64
三、DataFrame和Series转化为别的形式
.to_xx 就是df 和se 转化为其它支持的所有格式
list(se1) #将series转为list
dict(se1)#将series转为dict ,index为key
tuple(se1) #series转为元组,由值组成的()
se1.to_json() #series转为json index为key
如果处理完要入库,可以如下,这样把colums(列明) 当作key ,返回[{},{}] 可以直接入库
df7.to_dict(orient="records")
存到excel中 series也可以 要想追加就指定行号或者列号
writer = pd.ExcelWriter(filepath)
df.to_excel(excel_writer=writer,sheet_name='sheet1')
writer.save()
writer.close()
#另外也可以选择写入到一个sheet里
但是要加上startrow或者startcol参数,用来调整几个dataframe在表格中的格式,例如:
df.to_excel(excel_writer=writer,startcol=9)
df1.to_excel(excel_writer=writer,startrow=8)
具体的调整可以根据自己的需求设置
sheet_name:它是指包含DataFrame的工作表的名称。
header:写出列名。如果给出了字符串列表, 则假定它是列名的别名
startrow:默认值0。它指向转储DataFrame的左上单元格行。
startcol:默认值0。它指向转储DataFrame的左上方单元格列。
encoding:这是一个可选参数, 可对生成的excel文件进行编码。仅对于xlwt是必需的。
存到csv中
df.to_csv("abc.csv", encoding="utf_8_sig") # 处理中文乱码问题
四 、选取Series 和DataFrame中的值
对于series和dataframe都有位置坐标和索引坐标两套选取法
se1 = Series([1,2,3],index=['a','b','c'])
print(se1['a':'c'])
print(se1[0:2])
print(se1[[1,2]])
print(se1[['a','c']])
print(se1.values)
print(list(se1.index))
#loc 通过索引坐标 index 和colums 选取,iloc 通过列 行位置坐标选区 [,] 逗号前为index 行 后为 colums列
df1.loc[[0,1],'name'] #0 1 行 name列i
df1.loc[0,'name'] # 0index 行 name列
print(df1.loc[0:1,'name':'age'] ) # 0-1index 行 name- age列
.ix[ ]特点为综合了前面的,可以混用标签、位置下标存取。
同样的,下标中,第一个为行索引,第二个为列索引。
df1.ix['r2',1:3]
.at[ ]和.iat[ ] 能使用标签和整数下标获取单个值
df1.at['r1','c3'] # index 和colums
df1.get_value('r1','c3') #也是获取单值效率高点 r1 为index c3 为colums
除了通过列和行选区他们,还可以用条件过滤
常用方法:
判断值是否存在于其中:不应使用'3' in x,应使用'3' in x.values
切片:(类似于列表的方式)如:x[1:3]获取的值为索引为1和2,不包括3.
#se2 = se1[se1>2] #值大于2的
#se2 = se1*2 #设置会乘以2 字符串会重复一次
se2 = se1[se1.str.contains('a')] #值包含a的
根据值删除:如z=x['3'!=x.values],获取序列中值不为3的新序列,se1 = se1.drop('a') 根据index删除要接受新序列
数据追加:形如x=x.append(Series(['3'])),需要用原来的序列来接受。如果没有设置索引,那么就会默认从0开始自动设置索引
df1.drop([1,0]) #默认按照index 索引删除 删除 0 1行
df1.drop(['x','z'],axis=1) #指定axis=1 按照colums删除
df2.T #转置:index和colums交换
df1['sex'] = [] #添加新列 sex 为该列的colums
五 、常用方法
pandas apply()
pandas 的 apply() 函数可以作用于 Series 或者整个 DataFrame,
df1['name'].apply(fnc()) fnc接受到的参数就是点之前的对象遍历的元素 ,df1['name'] 是一列也就是series ,遍历元素就是该列的每一个值
df1.apply(fnc()) df1本身就一个,那个fnc 接受到的就是df1
df1.groupby('key1').apply(fnc()) 因为聚合后返回还是 几个dartafram ,所以fnc 能接受到的参数就是 那几个dataframe
def fnc(arg1):
参数arg1 是什么
df1.groupby()
可以聚合一个字段,或者多个字段
df1.groupby('key')
df1.groupby(['key1','key2'])
返回的是元组对象
for name,group in df1.groupby('key1'):
print('*'*13+name+'*'*13+'\n',group)
print()
for (key1,key2),group in df1.groupby(['key1','key2']):
print('*'*13+key1+key2+'*'*13+'\n',group)
print()
将分组结果变成字典
dict1=dict(list(df1.groupby('key1')))
print(dict1['b'])
dict2=dict(list(df1.groupby(['key1','key2'])))
print(dict2[('a','y')])
填充缺失数据,针对series 或者dataframe 中为NaN的数据进行填补
df1.fillna(100) NaN填补为100
#可以根据 列名字填补0 1 2 就是列名字
df1.fillna({0:10,1:20,2:30})
聚合函数agg()
grouped=df1.groupby(['sex','smoker'])
grouped['age'].agg('mean') 只求age列的平均值
grouped.agg('mean') 求所有列的平均值
grouped['age'].agg(['min','max']) 一列的多种聚合
grouped.agg({'age':['sum','mean'],'weight':['min','max']}) 多列的多种聚合
还可以更改聚合的列名和自定义聚合函数,或者直接列出常见的所有聚合
排序 series 和dataframe
按照索引排序
se1.sort_index() 升序
se2.sort_index(ascending=False) 降序
按照值排序
se4.sort_values() NaN会放在series末尾
df1.sort_index() 按照index排序
df1.sort_index(axis=1) 按照colums 排序
根据列值排序
df2.sort_values(by='b') 单列排序
df2.sort_values(by=['a','b']) 多列排序
series排名,返回该列的值的名次
se5=pd.Series([2,3,7,5,3,7])
se5.rank() 默认是平均排名,值一样名词就一样
0 1.0
1 2.5
2 5.5
3 4.0
4 2.5
5 5.5
dtype: float64
重建索引df1.reindex(['a','b','c','d']) 重建index索引
df1.reindex(index=['a','b','c','d'],columns=['one','two','three','four']) 重建index 和colums索引 就是给行和列序号重命名, 保存到pymongo时修改行序号 就是修改字段名
se2=se1.reindex(['a','b','c','d','e','f']) series重建索引
重名行和列索引
df_rename = df.rename(index={"2018-07-01": 71, "2018-07-02": 72, "2018-07-03": 73, "2018-07-04": 74},
columns={'a': 'rename_a', 'b': 'rename_b', 'c': 'rename_c', 'd': 'rename_d', 'e': 'rename_e'})
DataFrame删除空行
关于dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
参数的说明:
- axis:默认是0,即删除行。1或者columns则是删除列
- how:删除方式。any删除至少有一个NaN的行/列;all删除全部都是NaN的行/列
- thresh:阈值。int,删除的行/列至少有n个NaN值
- subset:列表。columns或者index,只删除指定列/行
2)pandas.notnull
1 | df = df[pd.notnull(df['a'])] |
3)pandas.isnull
1 | df = df[~pd.isnull(df['d'])] |
4)numpy.isnan
1 | df = df[~np.isnan(df['a'])] |
5)query
1 | df = df.query('a == a') |