Pandas 的三个基本数据结构:Series、DataFrame 和 Index
Pandas 的 Series 对象是一个带索引数据构成的一维数组。(numpy是隐式索引,series是显示索引)
Series (获取列元素)
import numpy as np
import pandas as pd
s1=pd.Series([1,2,3,4])
s1 输出 0 1 第一列为索引,第二列为数字
1 2
2 3
3 4
s1.values 输出 array([1, 2, 3, 4], dtype=int64) 获取值
s1.index 输出 RangeIndex(start=0, stop=4, step=1) 获取索引
s2=pd.Series({"1":1,"2":2})
s2.values
s2.index
s3=pd.Series([1,2,3],index=["A","B","C"]) #创建列数据,带索引
s2.values
s2.index
s2["A"] 根据索引取值
DataFrame (获取所有数据)
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
df=pd.read_excel() #读取某文件
df #查看导入的表
df.columns #查看索引
df_new=DataFrame(df,columns=['a,b']) #取a列、b列数据
df_new['a']=pd.Series(10,index=[0]) #把a列,索引为0的数据设为10
df_new['a']=pd.Series(1) #把a列,索引为0的数据设为10
df_new #查看新数据
pd.DataFrame(np.random.rand(3, 2),columns=['foo', 'bar'],index=['a', 'b', 'c'])
DataFrame与Series整合实例 (多个Series列组成一个DataFrame)
data={"a":["w","s","x"],"b":["e","d","c"]}
az=pd.DataFrame(data) #把data字典载入DataFrame中
az 输出
az.index 输出 RangeIndex(start=0, stop=3, step=1)
az.values 输出
az=az.T #矩阵转置
通过for循环获取每行元素
for i in az.iteritems():
print(i)
q=pd.Series(data)
q 输出
q=pd.Series(data["a"])
q 输出
type(q) 输出 pandas.core.series.Series
文件操作
import numpy as np
import pandas as pd
from pandas import Series,DataFrame
文件读入
df=pd.read_csv('df.csv')
df=pd.read_json(a.json)
df=pd.read_excel('C:/variety_project/python_project/test02/ftp/test/dzb20180508.xlsx')
df=pd.DataFrame(df)
...
文件写出
df.to_csv('df.csv',index=False) 文件写出到df.csv,索引不写出
df.to_html('a.html') 输出到html
...
df.head() 返回前5行
df.tail() 返回后5行
df.iloc[2:5,:] #返回第2到第5行,所有列数据
df.loc[2:4,:] #返回索引为2到4行,所有列数据
reindex 重新赋值索引
1、Series reindex
例:
s1=Series([1,2,3],index=[1,5,10])
s2=s1.reindex(index=range(15))
s2 输出
s2=s1.reindex(index=range(15),method="ffill") # method="ffill"表示,把所有NAN值,赋予上面的值
s2 输出
2、 dataFrame reindex
df1=DataFrame(np.random.rand(4).reshape([2,2]),index=["a","b"],columns=["a1","b1"])
df1 输出
df1.reindex(index=["a","b","c"],columns=["a1","b1","c1"]) #重新赋值索引
df1 输出
df1.reindex(index=["a"]) 可以通过reindex删除b列、c列数据
df1.drop("a",axis=0) 删除a行数据
df1.drop("a1",axis=1) 删除a1列数据
df1.isnull() 判断是否为nan
df1.notnull()
df1.dropna(axis=0,how="any") 删除含有nan的行
df1.dropna(axis=0,how="all") 删除所有元素为nan的行
df1.dropna(thresh=2) 删除含有2个nan元素的行
df1.fillna(values=1) 把所有nan填充成1
df1.fillna(values={0:0,1:1,2:2}) 把0行的nan填充成0,1行的nan填充成1,......
df.fillna(method='ffill') # 从前往后填充
df.fillna(method='bfill') # 从后往前填充
df2=s1.unstack() 二级series转换成DataFrame
stack() 反转
df2=DataFrame([s1["1"],s1["2"]]) 二级series转换成DataFrame
map添加数据
df1=DataFrame({"a":[1,2],"b":[3,4]})
g_map={1:5,2:6}
df1["c"]=df1["a"].map(g_map)
df1 输出
replace() 修改数据
df1.replace(1,9) 把索引1的数据修改成9
索引器:loc、iloc和ix
1、第一种索引器是 loc 属性,表示取值和切片都是显式的:
df. loc[1:3]
2、第二种是 iloc 属性,表示取值和切片都是 Python 形式的 隐式索引:
data.iloc[1:3]
A.add(B, fill_value=0) Nan值补0
df=pd.DataFrame(np.random.rand(4, 2),index=[['a', 'a', 'b', 'b'], [1, 2, 1, 2]],columns=['data1', 'data2']) 创建多级索引
pd.concat() 合并数组
pd.merge() 数据连接
pd.join() 数据连接
GroupBy 中最重要的操作可能就是 aggregate、filter、transform和 apply(累计、过滤、转换、应用)了
dates = pd.to_datetime([datetime(2015, 7, 3), '4th of July, 2015','2015-Jul-6', '07-07-2015', '20150708']) #设置时间格式
pd.date_range('2015-07-03', '2015-07-10') 生成区间日期
pd.date_range('2015-07-03', periods=8)
pd.period_range('2015-07', periods=8, freq='M')
DataFrame.eval()实现列间运算
df = pd.DataFrame([[1,2,3],[2,3,4]], columns=['A', 'B', 'C'])
result2 = pd.eval("(df.A + df.B) / (df.C)")
DataFrame.query()方法
result1 = df[(df.A < 0.5) & (df.B < 0.5)]