1、什么是series
series就是pandas中的一维标记数组,是主要数据类型之一
其元素包括data、index、dtype、name、copy
其调用例子如下:
import numpy as np
import pandas as pd
s = pd.Series(data=np.random.randint(10,20,size=3),
index=list('ABC'),name='age',dtype=np.int64)
print(s)
2、Series的索引
其索引包括两种(位置索引、标签索引)
位置索引:和c一样、用‘ [ ] ’进行索引 或者使用 ‘iloc[ ]’
标签索引:使用' [标签名] '或者' loc[标签名] '进行访问
print(s[1])
print(s.iloc[1])
print(s['A'])
print(s.loc['A'])
3、series分区
通过索引进行分区,例子如下
#位置索引
print(s.iloc[1:3])
print(s[1:3])
#标签索引
print(s.loc['A':'C'])
print(s['A':'C'])
值得注意的是,位置索引的1:3只会将s中的1、2进行分区,而标签索引中'A':'C'会将'A' 'B' 'C'三个元素进行分区
4、将series转换成DataFrame
4.1 使用DataFrame函数进行转换
df =pd.DataFrame(s,columns=['python'])
不知道为啥没转换成功
4.2 使用to_frame函数进行转换
df2=s.to_frame(name='python')
如果没有在转换时没有定义name且原series也没定义的话,会使用自然数进行填充
5、创建DataFrame
5.1 方法一 字典
import pandas as pd
data={
'Name':['Alice','Bob','Charlie'],
'Age':[25,30,35],
'City':['New York','London','Paris']
}
df=pd.DataFrame(data)
print(df)
5.2方式二 嵌套元组
data=[ ('Alice',25,'New York'),
('Bob',30,'London'),
('Charlie',35,'Paris')]
df=pd.DataFrame(data,columns=['name','age','city'])
结果同上图,在创建时需要给每一列定义名字
5.2方式三 NumPy数组创建
df=pd.DataFrame(data=np.random.randint(0,101, size=(500,3)),
columns=['Math','English','History'],dtype=np.int64
)
print(df)
6、pandas读写文件
6.1写文件
通过"to_"+文件后缀的形式进行输出,可以为.csv .json .xlsx等
以5.3为例将df输出为csv如下
df.to_csv('output.csv',index=True,sep=';')
#index=True 表示是否将索引导出
#sep=';' 表示每个元素之间用;进行间隔
在写为excel文件时,如果没有安装openpyxl包会报错,只需要在终端运行 pip install openpyxl。下载好后再次尝试
6.2读文件
使用“read_"开头的函数加上文件类型,常见的包括:CSV、Excel、JSON、SQL数据库等
以6.1写的文件为例进行读入(值得注意的是,写文件时的属性需要在读文件时也对应写上)
df=pd.read_csv('output.csv',sep=';')
7、DataFrame创建多层索引
7.1方式一使用pd.MultiIndex.from_tuples创建索引
tuples为元组 含义就是使用pandas中用元组建立多层索引
import pandas as pd
import numpy as np
#这里创建的两层索引,姓名、考试
index_lables=[('张三','期中'),('张三','期末'),('李四','期中'),('李四','期末')]
mult_index = pd.MultiIndex.from_tuples(index_lables,names=('name','exam'))
data = {
'python':[98,149,130,147],
'math':[95,78,143,104]
}
df=pd.DataFrame(data,index=mult_index)
7.2方式二:使用pd.MultiIndex.from_arrays(数组)
index_labels = [['张三','张三','李四','李四'],['期中','期末','期中','期末']]
mult_index=pd.MultiIndex.from_arrays(index_labels,names=('name','exam'))
df=pd.DataFrame(data,index=mult_index)
7.2方式三:使用pd.MultiIndex.from_product(笛卡尔积)
index_lables=pd.MultiIndex.from_product([['张三','李四','王五','赵六'],
['期中','期末']],
names=['name','exam'])
df=pd.DataFrame(np.random.randint(80,150, size=(8,2)),
index=index_lables,
columns=['python','math']
)
df1=pd.DataFrame(np.random.randint(80,150,size=(2,4)),
index=['张三','李四'],
columns=pd.MultiIndex.from_product([['python','math'],['期中','期末']]))
笛卡尔积使用的不同其创建的dataframe也不同
8、读写多层索引DataFrame
8.1写文件
与上述写文件一致
8.2读文件(待补充)
调用read_函数,注意声明index_col 参数
df=pd.read_excel('exam.xlsx',header=[0,1],index_col=0)
df1=pd.read_excel('exam1.xlsx',index_col=[0,1])
9、DataFrame数据重塑
9.1 转置
在进行转置时需要对df重新赋值,直接用df.T是有返回值的
df=df.T
9.2 长宽表转换
使用melt进行长表转换:将宽表转换为长表,即将列名转换为数据中的值
melt方法的参数:
self
id_vars “主键”名字
value_vars 所有取值的名字
var_name 原表表头中除去“主键”的表头名称
value_name: Hashable = "value",
col_level: Level | None = None,
ignore_index: bool = True,
import pandas as pd
import numpy as np
data={
'name':['张三','李四','王五'],
'math':[86,76,98],
'en':[87,98,67]
}
df=pd.DataFrame(data)
print(df)
df=df.melt(id_vars="name",value_name='corse',var_name="subject")
print(df)
privot 进行宽表转化
pivot的参数包括
self, *, columns, index=lib.no_default, values=lib.no_default
columns 表示每一列的表头
index 表示索引
value 表示元素值
import pandas as pd
import numpy as np
data=pd.read_csv('长表.csv')#即用melt转换的长表进行写的文件
df=pd.DataFrame(data)
print(df)
df=df.pivot(index='name',columns='subject',values='score')
print(df)
10、DataFrame多层索引行列转化
使用stack和unstack方法实现(只需要记住就行,在正常使用的时候多调用调用,找到最想要的样式)
stack 用来将列索引转换为行索引 unstack将行索引转化为列索引
import pandas as pd
import numpy as np
mult_index=pd.MultiIndex.from_product([
['张三','李四','王五','赵六'],
['期中','期末']
])
df=pd.DataFrame(data=np.random.randint(80,150,size=(8,2)),
index=mult_index,
columns=['python','math'])
print(df)
print(df.unstack())
#有个参数为level,默认值为-1,自行体验
11、merge数据融合
merge是将两个dataframe根据相同的列进行合并,相当于sql数据库中的join
right : DataFrame或命名的Series ,合并的对象。
how : {‘left’, ‘right’, ‘outer’, ‘inner’}, default ‘inner’ 默认为合并两个frame的交集
left: 仅使用左frame中的键,类似于SQL左外部联接;保留关键顺序
right: 仅使用右frame中的键,类似于SQL右外部联接;保留关键顺序。
outer: 使用两个frame中键的并集,类似于SQL完全外部联接;按字典顺序对键进行排序。
inner: 使用两个frame中关键点的交集,类似于SQL内部联接;保留左键的顺序。on:列名或索引 ,必须在两个DataFrame中都能找到。如果on为None且未用 索引 合并,则默认为两个DataFrame中列的交集
left_on : 左DataFrame中的列名或索引。也可以是左DataFrame长度的数组或数组列表。
right_on :右DataFrame中的列名或索引。也可以是右DataFrame长度的数组或数组列表。
left_index : bool, default False 左DataFrame的索引作为连接键
right_index : bool, default False 右DataFrame的索引作为连接键
sort : bool, default False 在结果DataFrame中按字典顺序对连接键排序。如果为False,联接键的顺序取决于联接类型(how关键字)。
copy : bool, 默认为True, 总是将数据复制到数据结构中。设为Fasle,尽可能避免复制。
————————————————版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_41300650/article/details/102693025
import pandas as pd
import numpy as np
data1={
'ID':[1,2,3],
'Name':['Alice','Bob','Charlie']
}
data2={
'ID':[2,3,4],
'Age':[25,30,22]
}
df1=pd.DataFrame(data1)
df2=pd.DataFrame(data2)
print(pd.merge(df1,df2,how='outer'))
import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.randint(0,150,size=(51,2)),
columns=['math','python'])
#print(df)
df2=df.mean(axis=1).to_frame("平均分")#为该列设置表头
#print(df2)
#可以使用concat进行整和
#print(pd.concat([df,df2],axis=1))
print(pd.merge(df, df2,left_index=True,right_index=True))
12、join数据连接
join()方法用于根据DataFrame的索引将两个DataFrame中的数据进行合并,使用前提:确保两个DataFrame的索引(或指定的列)有重叠的部分
语法: df1.join(df2,how='inner')
参数说明:
self,
other: DataFrame | Series | Iterable[DataFrame | Series],
on: IndexLabel | None = None,
*how: MergeHow = "left",默认为inner 可以设置为 left right outer
lsuffix: str = "",
rsuffix: str = "",
sort: bool = False,
validate: JoinValidate | None = None,
示例:
import pandas as pd
import numpy as np
employee_data={
'employee_id':[101,102,103,104,105],
'Name':['张三','李四','王五','赵六','钱七'],
'department':['HR','Engineering',"Marking","Finance","HR"]
}
df_employee=pd.DataFrame(employee_data)
salary_data={
'employee_id':[101,102,104,105],
'salary':[10000,12003,23000,10000]
}
df_salary=pd.DataFrame(salary_data)
#设置行索引
df=df_employee.set_index('employee_id').join(df_salary.set_index('employee_id'),how='inner')
print(df)
13、根据字段筛选数据
可以通过df.字段名、df[字段名]或df[['字段名']](此种方法可以拿取多列数据,并形成一个新的dataframe)
直接看代码
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randint(0,150,size=(150,3)),
columns=['math','python','english']
)
print(df)
print(df.python)
print(df["math"])
print(df[['math']])
print(df[['math','python']])
14、根据标签筛选数据
通过loc进行操作
import pandas as pd
import numpy as np
df=pd.DataFrame(np.random.randint(0,100,size=(10,3)),
index=list('ABCDEFGHIG'),
columns=['math','python','english']
)
print(df.loc['A'])
print(df.loc[['A']])
print(df.loc[['A','B']])
print(df.loc[['A','B'],['math','python']])
print(df.loc['A':'F',['math','python']])
print(df.loc[:,['math','python']])
print(df.loc['B'::2])#从B开始隔一个取一个