目录
0.导入导出操作
下面以excel为例,csv同理,
只要把read_excel改成read_csv,把to_excel改成to_csv即可。
0.1导入excel/csv表格
data=pd.read_excel("附件.xlsx",sheet_name="表单2",index_col=0)
pd.read_excel(io,sheet_name,index_col)
常用参数解读:
- io:文件地址
- sheet_name:表单名称,不填则默认导入第一个表单
- index_col=0:系统不自动产生新的索引,即利用原来表格的第一列作为索引
不填,则自动添加索引(0,1,2,3……)
0.2 导入时乱码的解决方法
import pandas as pd
import chardet
# 导入有乱码的文件
with open("filename.csv","rb") as file: # 先用普通方式打开文件
raw_data=file.read() # 读取数据
encoding=chardet.detect(raw_data)["encoding"] # 自动识别数据的编码方式
df=pd.read_csv("filename.csv",encoding=encoding,index_col=0) # 用识别到的编码方式来读取数据
0.3导出excel/csv表格
data.to_excel("附件1.xlsx",index=True)
df.to_excel(io,,sheet_name,index)
常用参数解读:
- df:表格
- io:文件地址
- sheet_name:表单名称,不填则默认导出至第一个表单
- index:True(默认),利用df的索引作为生成excel表格的索引
False,不利用df的索引作为生成excel表格的索引,即无索引
1.表格索引
1.1获得表格索引和列名
print("表格的列名:",data.columns)
print("表格的索引名:",data.index)
1.2更改非索引列的列名
data.columns=['A','B','C','D','E','F','G','H','I','J','K','L','M','N']
df.columns=[ ]
在方括号内填新的列名
1.3更改索引列的名称
data.index.rename("变量名",inplace=True)
df.index.rename("索引列的新名称",inplace=True)
1.4改变行索引名称
# 改变行索引名称
df.rename(index={"1906*":"1906"}, # 以字典形式给出
inplace=True)
要改变的行索引以字典形式给出
即:{old_name1:new_name1,old_name2:new_name2,...}
2.创建表格
df=pd.DataFrame(np.random.randn(24,4),index=list(range(0,24)),columns=list('ABCD'))
df=pd.DataFrame(data,index,columns)
常用参数解读:
- df:所创建的表格名称
- data:数据。无,则生成空表格
- index:索引名
- columns:列名
3.删除指定的列/行/缺失值
3.1删除指定的列
data.drop(["A"],axis=1,inplace=True) # 删除列,inplace=True不生成新表格
3.2删除指定的行
data.drop(["15"],axis=0,inplace=True)
3.3删除缺失值,不改变行索引
data.dropna(inplace=True) # 删除缺失值,但不会自动改变行索引
df.dropna(inplace=True)
常用参数解读:
- inplace=True:不生成新表格
3.4删除缺失值,改变行索引
data.dropna(inplace=True) # 删除缺失值
data.dropna().reset_index(drop=True) # 改变行索引
4.填充缺失值
data.fillna(0,inplace=True) # 把缺失值填充为0
df.fillna(value,inplace=True)
常用参数解读:
- value:把缺失值填充为value
- inplace=True:不生成新表格
5.数据替换
data.replace(0,0.04,inplace=True) # 把原来表格中的0替换成0.04
data.replace(被替换的数据,替换成的数据,inplace=True)
6.两个表格融合
data_1 = pd.read_excel('附件1.xlsx')
data_2 = pd.read_excel('附件2.xlsx')
result = pd.merge(data_2, data_1, on=['单品编码'], how='left') # on的列 用于标识每行数据;how='left':左连接
# 查看结果
print(result)
df3=pd.merge(left, right, on, how)
常用参数解读:
- left:左表
- right:右表
- on:用来对齐的列名。要保证左表和右表用来对齐的那一列,都有相同的列名。
- how:融合的方法。
可选:
‘left’按照左表的索引顺序,
‘right’按照右表的索引顺序,
‘outer’外连接,取并集
‘inner’内连接,取交集(默认)
‘cross’- 详见:Python 玩转数据 17 - Pandas 数据处理 合并 pd.merge() df1.merge(df2)_df.merge-CSDN博客
7.表格合并
data1= pd.concat([data.sum(),data.mean(),data_date.max()], axis=1)
print(data1)
8.表格透视
data_date_item=data1.pivot_table(index="销售日期", # 行索引名
columns="单品名称", # 列名
values="销量(千克)", # 表格中的内容
aggfunc="sum") # 聚合方式
df2=df1.pivot_table(index,columns , values, aggfunc)
常用参数解读:
- index:行索引名
- columns:列名
- values:表格中的数据内容
- aggfunc:聚合方式,一般选"sum",也就是df1中将相同行索引名、相同列名的数据求和,再放进df2
- 详见:python中Pandas的简单实例应用/resample函数/pivot_table函数/时间序列/使用数据透视和重采样从股指成分股进出记录得到月频的股指成分股数据_resample函数python-CSDN博客
9.转置
data=data.T
10.遍历整个表格
for idx in data.index:
for col in data.columns:
# 以上两行就可以遍历整个表格
if data.loc[idx,col]==0:
data.loc[idx, col] =0.04 # 把0替换为0.04
关键句
for idx in data.index:
for col in data.columns:
11.获取表格统计信息
data=pd.read_excel("附件.xlsx",index_col=0)# "index_col=0" 若加上这句,系统不会自动加上新的行索引,而是使用原有的第一列作为行索引
# python自带的统计描述
print("python自带的统计描述",data.describe())
# 一般更多需要"平均值","标准差","最小值","最大值","偏度","峰度",下面求这6个值并制作成表格
arr=np.array(data.describe().iloc[[1,2,3,-1],:])
arr=np.vstack([arr,data.skew()])
arr=np.vstack([arr,data.kurt()])
data_describe=pd.DataFrame(arr,index=["平均值","标准差","最小值","最大值","偏度","峰度"],columns=data_date_class.kurt().index)
print("统计描述:\n",data_describe)
12.按指定列的值进行排序
12.1按指定的一列排序
例如:
按指定的名为"B"的列 进行排序
# 按指定列的值排序
data.sort_values(by="B",inplace=True)
12.2按指定的多列排序
例如:
依次按指定的 Column1, Column2, Column3 进行排序
# 按 Column1, Column2, Column3 依次进行排序
df_sorted = df.sort_values(by=['Column1', 'Column2', 'Column3'])
by=['Column1', 'Column2', 'Column3']
:指定按这些列依次进行排序。
12.3自定义排序方向:
默认情况下,sort_values()
是按升序排序的。
如果需要按降序排序,可以通过 ascending=False
来设置
ascending
参数接受一个布尔值的列表。如果你有多个列,并且需要每个列的排序方向不同,可以为每个列指定一个排序方向。True
表示升序排序False
表示降序排序
例如:
ascending=[True, False, True]
表示第一列升序,第二列降序,第三列升序。
df_sorted = df.sort_values(by=['Column1', 'Column2', 'Column3'], ascending=[False, True, False])
13.重采样resample()
data2=data1.resample('3M').sum()
要求:索引必须是时间
常用参数解读:
- '3M'表示按每3个月进行采样,还可以换成:'M'表示按每1个月进行采样,'D'表示按每1天进行采样
- sum()是填充方法,即求和后填充,还可以换成:last()即最后一个数据作为填充,,ffill(),bfill()等
14.对重复数据的处理
14.1对重复数据进行合并求和
import pandas as pd
import numpy as np
# 创建一个表格作为示例
values=np.array([1,2,3,4,5])
data=pd.DataFrame(values,index=["红","橙","黄","红","黄"],columns=["出现次数"])
data.index.rename("颜色",inplace=True)
print(data)
# 对“颜色”的“出现次数”进行求和
data_sum_by_color=data.groupby("颜色")["出现次数"].sum()
print(data_sum_by_color)
df_sum=df.groupby( )[ ].sum()
常用参数解读:
- 第一个圆括号内:有重复数据的列名
- 第一个方括号内:被求和数据的列名
- 详见:python对重复数据进行合并求和_pandas 相同的求和-CSDN博客
14.2从含有重复数据的列中 提取不重复的值
years=df["Year"].drop_duplicates()
从表格df 名为"Year"的列中取出其中不重复的值
如果想把这些不重复的值转换成表格,则加上 .tolist()
years_list = df["Year"].drop_duplicates().tolist()
如果要对数据进行排序,则加上 .sort_values()
sorted_years = df["Year"].drop_duplicates().sort_values().tolist()
15.中心对数比变换(表格版)
中心对数比变换是专门针对成分数据的一种数据处理方法
这个函数能直接对表格进行操作,且返回值也是一个列表
def centered_log_ratio(data):
data_clr=pd.DataFrame(index=data.index,columns=data.columns) # 创建一个空表格
D=data.shape[1] # 成分的个数
data_ln=np.log(data)
for i in range(D):
data_clr.iloc[:,i]=data_ln.iloc[:,i]-np.mean(data_ln,axis=1)
return data_clr
注意: 为了避免中心化后出现inf或nan, 一定要将0替换成正值 ,并将nan填充成正值
16.利用表格的列数据来绘图
16.1利用所有列的数据
df.plot(kind='line', marker='o', figsize=(9, 6))
解释:
表格的索引列是年份Year,绘图时自动以索引列为x轴
表格df中共有9列数据,这行代码会用所有9列的数据来绘图
16.2利用指定列的数据
如果不想用所有列的数据,只想使用指定列数据,则用以下的代码:
'''利用表格 指定列的数据 来作图'''
# 选择索引列,这个索引列会作为 图的x轴
df.set_index("Year",inplace=True)
# 利用表格 指定列的数据 来作图
df.plot(kind='line',
y=["Gold","Silver","Bronze","Total"], # 选择指定的列
marker='o',
figsize=(9, 6), # 图幅大小
color=["indianred","goldenrod","teal","royalblue"]) # 分别指定每条折线的颜色