DataFrame
DataFrame定义
DataFrame是一个类似于表格的数据类型,可以理解为一个二维数组,
索引有两个维度,可更改。DataFrame具有以下特点:
-
列可以是不同的类型
-
大小可变
-
标记轴(行和列)
-
针对行与列进行轴向统计
DataFrame创建
DataFrame统一的创建形式为:
import pandas as pd
pandas.DataFrame(data=None, index=None, columns=None,
dtype=None, copy=False)
参数名称 | 说明 |
---|---|
data | 数据ndarray(结构化或同类),Iterable,dict或DataFrame |
index | 行标签,或类似数组 |
columns | 列标签,或类似数组 |
dtype | 元素数据类型 |
copy | 是否可复制 |
import pandas as pd
# 1.创建一个空的DataFrame
df = pd.DataFrame()
print(df)
# 2.从列表创建DataFrame
data = [1,2,3,4,5]
df = pd.DataFrame(data)
print(df)
# 3.从二维列表创建DataFrame
data = [['Alex',10],['Bob',12],['Clarke',13]]
df = pd.DataFrame(data,columns=
['Name','Age'],dtype=float)
print(df)
# 4.从列表嵌套字典创建DataFrame
data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
print(df)
# 5.从字典创建DataFrame
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':
[28,34,29,42]}
df = pd.DataFrame(data, index=['s1','s2','s3','s4'])
print(df)
# 6.从字典创建DataFrame
data = {'one' : pd.Series([1, 2, 3], index=['a', 'b',
'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a',
'b', 'c', 'd'])}
df = pd.DataFrame(data)
print(df)
DataFrame常用属性
属性名称 | 描述 |
---|---|
DataFrame.index | DataFrame的索引(行标签) |
DataFrame.columns | DataFrame的列标签 |
DataFrame.dtypes | 返回DataFrame中元素的dtype |
DataFrame.info | 打印DataFrame的简要摘要 |
DataFrame.values | 返回DataFrame的值,返回值为ndarry |
DataFrame.shape | 返回一个表示DataFrame维数(形状)的元组 |
DataFrame.empty | 指示DataFrame是否为空 |
import pandas as pd
# 创建DataFrame
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':
[28,34,29,42]}
df = pd.DataFrame(data, index=['s1','s2','s3','s4'])
print(df)
# 添加score列
df['score']=pd.Series([90, 80, 70, 60], index=
['s1','s2','s3','s4'])
print(df)
# 轴的列表
print(df.axes)
# 数据类型
print(df['Age'].dtype)
# 是否空DataFrame
print(df.empty)
# 轴数
print(df.ndim)
# 元素个数
print(df.size)
12
# 行标签
print(df.index)
# 值
print(df.values)
# df的前三行
print(df.head(3))
# df的后三行
print(df.tail(3))
核心数据结构操作
显示索引,列
import pandas as pd
# 创建DataFrame
data = {'Name':['Tom', 'Jack', 'Steve', 'Ricky'],'Age':
[28,34,29,42]}
df = pd.DataFrame(data, index=['s1','s2','s3','s4'])
df.index
df.columns
索引选择
操作 | 语法 | 返回值 |
---|---|---|
选择列 | df[col] | Series |
按标签选择行 | df.loc[label] | Series |
按整数位置选择行 | df.iloc[loc] | Series |
切片行 | df[5:10] | DataFrame |
通过布尔向量选择行 | df[bool_vec] | DataFrame |
复合索引的访问:
# 访问行
df.loc['classA']
df.loc['classA', 'F']
df.loc[['classA', 'classC']]
# 访问列
df.Age
df.Age['20+']
df['Age']
df['Age', '20+']
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3jiuzlgs-1690253158398)(https://s2.loli.net/2023/07/25/jLQUZK1kpXxCc8r.png)]
# groupby
groupby(["clazz","subject_id"]) # 将clazz和subject_id分组
# rank()
rank("dense",ascending=False) # 将选定的元素排序,dense表示排序模式,ascending=False为降序,True为升序
df3[df3["rank"]<=3] #取出小于等于3的元素
# 将分组显示出来
切片
# 删除index为0的行
df = df.drop(0)
print(df)
# drop方法删除列
df.drop(['three'], axis=1)
# 列添加 insert功能可插入到列中的特定位置
df.insert(1, 'five', df['one'])
loc是针对DataFrame索引名称的切片方法。如果传入的不是索引名称,那么切片操作将无法执行,利用loc方法,能够实现所有单层索引
切片操作。
loc方法使用方法如下:DataFrame.loc[行索引名称或条件, 列索引名
称]
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b',
'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b',
'c', 'd'])}
df = pd.DataFrame(d)
print(df.loc['b'])
print(df.loc[['a', 'b']])
print(df.loc['a':'c'])
print(df.loc['a':'c','one':'two'])
iloc和loc区别是iloc接收的必须是行索引和列索引的位置
DataFrame.iloc[行索引位置, 列索引位置]
# 绝对位置
import pandas as pd
d = {'one' : pd.Series([1, 2, 3], index=['a', 'b',
'c']),
'two' : pd.Series([1, 2, 3, 4], index=['a', 'b',
'c', 'd'])}
df = pd.DataFrame(d)
print(df.iloc[2])
print(df.iloc[[2, 3]])
print(df.iloc[2:3,0:1])
修改DataFrame中的数据
更改DataFrame中的数据,原理是将这部分数据提取出来,重新赋值为新的数据
import pandas as pd
df = pd.DataFrame([['zs', 12], ['ls', 4]], columns =
['Name','Age'])
df2 = pd.DataFrame([['ww', 16], ['zl', 8]], columns =
['Name','Age'])
df = df.append(df2)
df['Name'][0] = 'Tom'
print(df)
import pandas as pd
df = pd.DataFrame([['zs', 12], ['ls', 4]], columns =
['Name','Age'])
df2 = pd.DataFrame([['ww', 16], ['zl', 8]], columns =
['Name','Age'])
df = df.append(df2)
df['Name'][0] = 'Tom'
print(df)