python3 Pandas

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')
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值