DataFrame
- 是一种表格型的二维数据结构既有行索引(index),又有列 索引(columns),默认都是从0开始递增每一列看作是共同用一个索引的 Series不同列的数据类型可以不同
可以根据输出有没有dtype分辨是Series或DataFrame
创建 DataFrame 对象
- 用二维数组创建
import numpy as npimport pandas as pd""" ndarray创建DataFrame对象 """d = np.array([[1, 2, 3], [4, 5, 6]])df = pd.DataFrame(d)print(df) #输出矩阵 2*3
2. 用列表创建
""" 单一列表创建DataFrame对象 """d = ['Tom', 'Bob', 'Linda']df = pd.DataFrame(data=d)print(df) #输出矩阵 1*3
修改 DataFrame 索引
- 修改对应的属性即可
import pandas as pdd = {'name': ['Tom', 'Bob', 'Linda'], 'age': [17, 18,26], 'height': [172, 176, 188]}print(df) #输出单行列表df = pd.DataFrame(data=d, index=['p1', 'p2', 'p3'])print(df) #输出矩阵 3*3""" 修改行索引 """df.index = ['n1', 'n2', 'n3']""" 修改列索引 """df.columns = ['names', 'ages', 'heights']print(df)
访问 DataFrame 数据
- 索引获取列数据,切片获取行数据
import pandas as pdd = {'name': ['Tom', 'Bob', 'Linda'], 'age': [17, 18,26], 'height': [172, 176, 188]}df = pd.DataFrame(data=d, index=['p1', 'p2', 'p3'])print(df)# 索引获取列数据print(df['age'])print(df[['age', 'name']])# 切片获取行数据print(df[0: 1]) # 下标切片左闭右开print(df['p1': 'p2']) # 标签切片两边都是闭区间# 组合使用print(df[['name', 'age']][0:: 2])print(df[0:: 2][['name', 'age']])
- loc指定标签获取数据(根据行列标签)
import pandas as pdd = {'name': ['Tom', 'Bob', 'Linda'], 'age': [17, 18,26], 'height': [172, 176, 188]}df = pd.DataFrame(d, index=['p1', 'p2', 'p3'])print(df)""" loc允许接两个参数分别是行和列, 且只能接收标签索引 """# 选取行索引为'p1'的数据print(df.loc['p1'])# 选取行索引为'p2'且列索引为'age'的数据print(df.loc['p2', 'age'])# 选取行索引为'p2'且列索引分别为'age'和'name'的数据print(df.loc['p2', ['age', 'name']])print()# 选取行索引分别为'p3'和'p2'且列索引分别为'age'和'name'的数据print(df.loc[['p3', 'p2'], ['age', 'name']])
2. iloc指定下标获取数据(根据位置)
import pandas as pdd = {'name': ['Tom', 'Bob', 'Linda'], 'age': [17, 18,26], 'height': [172, 176, 188]}df = pd.DataFrame(d, index=['p1', 'p2', 'p3'])print(df)print()""" iloc允许接两个参数分别是行和列, 且只能接收整数索引 """ # 选取行索引为0的数据print(df.iloc[0])print()# 选取行索引为1且列索引为1的数据print(df.iloc[1, 1])print()# 选取行索引为1且列索引分别为1和0的数据print(df.iloc[1, [1, 0]])print()# 选取行索引分别为2和1且列索引分别为1和0的数据print(df.iloc[[2, 1], [1, 0]])
列表标签当字典的列去看
修改 DataFrame 数据
- 对访问的数据重新赋值,即可修改数据;如果访问数据不存在,则 会添加数据创建DataFrame数据(使用下面操作的前置操作)
import pandas as pdd = {'name': ['Tom', 'Bob', 'Linda'], 'age': [17, 18,26], 'height': [172, 176, 188]}df = pd.DataFrame(data=d, index=['p1', 'p2', 'p3'])print(df)print()
- 修改单列数据
df['height'] = pd.Series([1.72, 1.88, 1.76],index=df.index)df['height'] = [1.72, 1.88, 1.76]df.loc[:, 'age'] = [1, 2, 4]df.iloc[:, 2:3] = [1.72, 1.88, 1.76]print(df)
- 修改多列数据
df[['name', 'age']] = pd.DataFrame({'name': ['Bob', 'Tom', 'Jack'], 'age': [19, 22, 27]}, index=df.index)df[['name', 'age']] = [['Bob', 19], ['Tom', 22], ['Jack', 27]]df.loc[:, ['name', 'age']] = [['Bob', 19], ['Tom',22], ['Jack', 27]]df.iloc[:, :2] = [['Bob', 19], ['Tom', 22], ['Jack', 27]]print(df)
- 追加单列数据
df['weight'] = pd.Series([65, 75, 60], index=df.index)df['weight'] = [65, 75, 60]df.loc[:, 'weight'] = [65, 75, 60]print(df)
- 追加多列数据
df[['grade', 'address']] = pd.DataFrame({'grade':['一', '二', '三'], 'address': ['威宁路', '长宁路', '大马路']}, index=df.index)df[['grade', 'address']] = [['一', '威宁路'], ['二', '长宁路'], ['三', '大马路']]df.loc[:, ['grade', 'address']] = [['一', '威宁路'],['二', '长宁路'], ['三', '大马路']]print(df)
- 修改单行数据
df[1:2] = ['Tony', 23, 178]df.loc['p2'] = pd.Series(['Tony', 23, 178], index=df.columns)df.iloc[1] = ['Tony', 23, 178]df.iloc[1:2] = ['Tony', 23, 178]print(df)
- 修改多行数据
df[:2] = [['Jack', 27, 1.76], ['Tony', 19, 1.72]]df.loc[:'p2'] = [['Jack', 27, 1.76], ['Tony', 19, 1.72]]df.iloc[[0, 1]] = [['Jack', 27, 1.76], ['Tony', 19, 1.72]]print(df)
- 追加单行数据
df.loc['p4'] = ['Toby', 23, 178]print(df)
Series 常用属性
DataFrame运算
- 行索引名和列索引名一样的值进行运算,其他不一样的做并集且对应的值为NaN
import pandas as pdimport numpy as npd = np.arange(9).reshape((3, 3))df1 = pd.DataFrame(d, columns=list('abc'), index=['n1', 'n2', 'n3'])print(df1)print()print(df1 + 1)print()d = np.arange(16).reshape((4, 4))df2 = pd.DataFrame(d, columns=list('dacf'), index=['n1', 'n2', 'n3', 'n4'])print(df2)print()print(df1 + df2)