DataFrame
- 是一种表格型的二维数据结构
- 既有行索引(index),又有列 索引(columns),默认都是从0开始递增
- 每一列看作是共同用一个索引的 Series
- 不同列的数据类型可以不同
可以根据输出有没有dtype分辨是Series或DataFrame
创建 DataFrame 对象
- 用二维数组创建
import numpy as np
import 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 pd
d = {'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 pd
d = {'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 pd
d = {'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 pd
d = {'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 pd
d = {'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 pd
import numpy as np
d = 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)