Python——Pandas(DataFrame结构)

310 阅读4分钟

DataFrame

  • 是一种表格型的二维数据结构
  • 既有行索引(index),又有列 索引(columns),默认都是从0开始递增
  • 每一列看作是共同用一个索引的 Series
  • 不同列的数据类型可以不同

image.png

可以根据输出有没有dtype分辨是Series或DataFrame

创建 DataFrame 对象

  1. 用二维数组创建
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']])
  1. 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 常用属性

image.png image.png

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)