pandas处理excel

START

 

import pandas as pd
url = "input.xls"
data = pd.read_excel(io=url,index_col="age",sheet_name=0)
"""
参数:
io 代表文件路径
index_col 代表索引列
sheet_name 为第几张工作表 默认为第一个,可以用索引,也可以用名字
"""

 

输出所有信息

print(data,type(data))
"""
id name 个性签名
age
23 1 a1 哥的地盘
24 2 a2 哥的传说
25 3 a3 心花怒放
26 4 a4 倚天屠龙
27 5 a5 逍遥剑先
<class 'pandas.core.frame.DataFrame'>
"""

按照索引,输出一行数据

 

print(data.loc["a2"])

-----------------------
id 2
age 24
个性签名 哥的传说
Name: a2, dtype: object

 

后面获取单个字段

 

print(data.loc["a2"].get("个性签名"))
-----------------------------------
哥的传说

 

获取所有的列的字段名

print(data.columns)
-------------------
Index(['id', 'age', '个性签名'], dtype='object')



print(data.columns.values)
------------------------------
['id' 'age' '个性签名']

获取一列:

print(data["age"]) #单个字段
---------------------
name
a1 23
a2 24
a3 25
a4 26
a5 27




print(data[["age","id","个性签名"]]) #也支持多个字段 以数组传参
-----------------------------
age id 个性签名
name
a1 23 1 哥的地盘
a2 24 2 哥的传说
a3 25 3 心花怒放
a4 26 4 倚天屠龙
a5 27 5 逍遥剑先

如何遍历呢?

 

for idx,row in data.iterrows():  #idx=索引的值,row=一行数据
print(f"{idx}的数据为:")
for key in data.columns.values:
s = f"{key}:{row.get(key)}"
print(s)
print("----------")
---------------------------------------------------------------
a4的数据为:
id:4
age:26
个性签名:倚天屠龙
----------
a5的数据为:
id:5
age:27
个性签名:逍遥剑先
----------

 

做数据的条件判断。

 

print(data.loc[data["id"] > 3,["个性签名","id"]])
print(data["id"] == 2)
------------------------------------------------------------
个性签名 id
name
a4 倚天屠龙 4
a5 逍遥剑先 5

 

将数据保存为excel

 

data_frame1 = data.loc[data["id"] > 3,["个性签名","id"]]
data_frame1.to_excel("output.xlsx")

 

剩下的我该去补一补基础喽,numpy 和 pandas

-----------------------------numpy---------------------------------------

pip install numpy

如何创建对象

 

#第一种创建方式
arr = np.array([11,22,33])
print(arr,type(arr))
-------------
[11 22 33] <class 'numpy.ndarray'>


#第二种创建方式: 通过读取文件

#第三种创建方式
arr = np.ones(shape=(3,3)) # 全部为1
arr = np.zeros(shape=(3,3)) #全部为0
arr = np.arange(1,26).reshape(5,5) #range效果一样
arr = np.random.randint(0,100,size=(3,5))#取值伪随机数,需要指定size
arr = np.linspace(0,10,num=5) #从a到b分为n份

 

属性:

 

print(arr.shape) #形状
print(arr.ndim)# 几维
print(arr.size)#一共有多少个数据
print(arr.dtype)#数据类型

 

方法:

 

arr.reshape(1,25)

 

索引和切片

#print(arr[0][3]) = print(arr[0,3]) #索引取值

print(arr[1:,:2]) #切片

print(arr[1:][:3]) #代表先切出来一个结果 再继续切!!!!!!!!!!!!!!!注意

#注意 一定要在一个括号里面切

将数组转化为一维数组:这里说一下,不止是用于pandas也适用于numpy

 

arr.flatten()

 

聚合函数:

 

arr1.sum(axis=1)

 

级联:

data = np.concatenate((arr0,arr1),axis=1)
------------------------------------------
[[0. 0. 1. 1.]
[0. 0. 1. 1.]]

np.hstack((arr0,arr1)) #== (axis = 1)
np.vstack((arr0,arr1)) #== (axis = 0)

-----------------------------------------pandas---------------------

分为两种数据类型

"""series : 为一维数据dataframe: 二维数据"""

创建series数据方式

 

s = pd.Series(data=[1,2,"abc"],index=["a","b","c"]) #基本创建
dic = {
"name":"wusen"
}
s = pd.Series(data=dic)#通过字典创建

print(s,type(s))
----------------------------------------------------
a 1
b 2
c abc
dtype: object <class 'pandas.core.series.Series'>

 

索引切片:

 

pass:跟别的一样,不试了,不重要

 

属性:

 

print(s.shape) #太懒了,不写了
print(s.size)
print(s.index)
print(s.values)
print(s.dtype)

 

方法:

 

print(s.head(1)) #前一个数据
print(s.tail(1)) #后一个数据
print(s.unique()) #去重
print(s.isnull) #这个方法没搞明白是啥

#series运算的时候索引必须一样

 

二维数组dataframe

创建:

 

df = pd.DataFrame(data=np.arange(1,10).reshape(3,3),index=["a","b","c"],columns=["A","B","C"])
print(df,type(df))
-------------------------------------------
A B C
a 1 2 3
b 4 5 6
c 7 8 9 <class 'pandas.core.frame.DataFrame'>

#默认索引和列 都是0123456 只有手动指定以后才会变

 

属性:

 

print(df.index)
print(df.columns)
print(df.values)
print(df.shape)

 

索引切片

 

# print(df["A"]) #取一列
# print(df[["A","B"]]) #取多列
# print(df[["A","B"]]["A"]) #在多列基础上继续取列
# print(df.iloc[0]) #隐士取一行
# print(df.iloc[0:]) #隐士取多行
# print(df.loc["a"]) #显式取一行
# print(df.loc[["a","b"]]) #显式取多行

# print(df.iloc[1,1]) #隐式取值
# print(df.iloc[[1,2],[1,2]]) #隐式取值
# print(df.iloc[:,:]) #隐式切片取值

 

其他知识点:

 

# 如何给某一列转换为时间格式
# df["time"] = pd.to_datetime(df["time"])
# 将某一列数据作为行索引,inplace=True 将新数据赋值给原来的变量
df.set_index("A",inplace=True)
print(df)

 

数据清洗:

缺失值:None 不可以参与运算

np.nan(NAN) 可以参与运算

重复值

异常值

处理缺失值:

 

# df = pd.DataFrame(data=np.arange(1,10).reshape(3,3))
# df.iloc[1,1] = None #会默认转化为NAN
# print(df)
# 方式一:对空值过滤,删除行数据
# 太麻烦了
# print(df.isnull().any(axis=1)) #any是检测 行或者列中是否有True
# print(df.isnull().any(axis=1).index)
# df = df.drop(labels=df.isnull().any(axis=1).index,axis=1)
# 方式二:
# print(df.dropna(axis=0))
# 方式三:
# print(df.fillna(value=0)) #默认指定一个数值
# print(df.fillna(method="ffill",axis=1)) #同一行,前一个数据
# print(df.fillna(method="bfill",axis=1)) #同一行,取后一个数据

 

处理重复值:

 

df = pd.DataFrame(np.arange(1,26).reshape(5,5))
df.iloc[1] = [0,0,0,0,0]
df.iloc[2] = [0,0,0,0,0]
df = df.drop_duplicates(keep="first") #keep : {'first', 'last', False}, default 'first'

 

处理异常数据:

 

# 处理异常数据
# df = pd.DataFrame(data=np.random.random(size=(1000,3)),columns=["A","B","C"])
# print(df)
# twice_std = df["C"].std()*2 # 条件
# -(df["C"] > twice_std)
# df.loc[-(df["C"] > twice_std)]
# 异常值练习
# df = pd.DataFrame(data=np.arange(9).reshape(3,3),columns=["A","B","C"])
# print(df)
# print(df["A"]>3)
# print(df.loc[df["A"]>3])

 

级联操作:

 

# df1 = pd.DataFrame(data=np.ones(shape=(2,2)),columns=["A","C"])
# df2 = pd.DataFrame(data=np.zeros(shape=(2,2)),columns=["A","B"])
# print(pd.concat((df1,df2)))# 默认为0
# print(pd.concat((df1,df2),axis=1))
# print(pd.concat((df1,df2),axis=0,join="inner"))#参数为内连接

 

合并数组:

 

# data1 = {
# "name":["a","b","c"],
# "age":[11,22,33]
# }
# df1 = pd.DataFrame(data=data1)
# data2 = {
# "name":["a","b","c"],
# "num":[1111,2222,3333]
# }
# df2 = pd.DataFrame(data=data2)
# print(pd.merge(df1,df2,on="name"))
# # 参数on = left——on + right_on
# #参数how = "inner"

 

高级操作--------------------------

按照一维数组 指定替换某个值:

 

df = pd.DataFrame(data=np.arange(1,10).reshape(3,3),index=["a","b","e"],columns=["A","B","C"])
print(df.replace(to_replace=5,value="HHHH"))#变成一维数组,第一个数字改变
print(df.replace(to_replace=[1,3],value="HHHH"))#变成一维数组,列表里面的位置都会变
print(df.replace(to_replace={1, 3,6},value="HHHH"))#变成一维数组,列表里面的位置都会变

 

映射 map

 

dic = {
"name":["张三","李四"],
"num":[5000,8000]
}
df = pd.DataFrame(data=dic)
# 定义映射关系
mapper = {
"张三":"是个傻子",
"李四":"不是傻子"
}
df["sign_name"] = df["name"].map(mapper)
print(df)

 

映射例子一:

 

# def after_num(s):#计算税后薪资
# return s - (s-3000)*0.5
# df["after_num"] = df["num"].map(after_num)
# print(df)

 

随机抽样:

 

# df = pd.DataFrame(data=np.arange(12).reshape(4,3),columns=["A","B","C"])
# print(df)
# # np.random.permutation(3) = [2,1,0] 打乱
# # df = df.take([2,1,0],axis=1)
# df = df.take(np.random.permutation(3),axis=1).take(np.random.permutation(4),axis=0)
# print(df)

 

----数据分类处理

 

dic = {
"name":["A","A","B","C"],
"num":[10,20,33,44]
}
df = pd.DataFrame(data=dic)
自定义高级聚合函数:.transform(fun1)    ==   apply(fun1)
def fun1(s):
return s+100
print(df.groupby(by="name")["num"].transform(fun1))
"""
# print(df.groupby(by="name")["num"].mean())
# mapper = df.groupby(by="name")["num"].mean().to_dict()
# df["mean_num"] = df["name"].map(mapper)
# print(df)

 

透视表 && 交叉表

 

#这个怎么说呢,就相当于group by

dic = {
"name":["A","A","B","C"],
"num":[10,20,33,44]
}
df = pd.DataFrame(data=dic)
print(df)
# pandas高级操作-透视表&交叉表
print(df.pivot_table(index="name",values=["num"],aggfunc="sum"))
"""
index:分类条件
values:计算的列
aggfunc:聚合函数
columns:再一次分类
fill_value:NaN的替换值
"""
# 交叉表:
# pd.crosstab(df.age,df.smoke)
"""
参数跟pivot_table的差不错
"""

 

工作中遇到的新问题:

 

#1.将所有的NAN换成空字符串,用replace
df = df.replace([np.NAN,-np.NAN],"")
print(df)
2.新加一行数据:
dic = {
"name":["A","B","C"],
"age":[1,2,3]
}
df = pd.DataFrame(dic)
new = pd.DataFrame({"name":"hhhh"},index=["0"])
df = df.append(new,ignore_index=True)#如果加上这个参数,

笔记:如果其他值不写的话,那么它默认为NAN
3.给选中的元素赋值用at  (用loc好像不可以赋值)
df.at[index,colunm] = new_value
4.筛选条件  &并且   |或者     ~取反
df_new = df[(df["Line"] == line) & (df["Shift"] == shift)]

 

posted @ 2022-08-20 15:57    阅读(60)  评论(0编辑  收藏  举报