DataFrame 是一个表格型的数据结构,它含有一组有序的列,每列可以是不同的值类型(数值、字符串、布尔型值)。DataFrame 既有行索引也有列索引,它可以被看做由 Series 组成的字典(共同用一个索引)。
类似于excel表格了
DataFrame 特点:

  • 列和行: DataFrame 由多个列组成,每一列都有一个名称,可以看作是一个 Series。同时,DataFrame 有一个行索引,用于标识每一行。
  • 二维结构: DataFrame 是一个二维表格,具有行和列。可以将其视为多个 Series 对象组成的字典。
  • 列的数据类型: 不同的列可以包含不同的数据类型,例如整数、浮点数、字符串等。
    pandas-DataStructure.png
    df-dp.png
pandas.DataFrame( data, index, columns, dtype, copy)

参数说明:

  • data:一组数据(ndarray、series, map, lists, dict 等类型)。
  • index:索引值,或者可以称为行标签。
  • columns:列标签,默认为 RangeIndex (0, 1, 2, …, n) 。
  • dtype:数据类型。
  • copy:拷贝数据,默认为 False。
    Pandas DataFrame 是一个二维的数组结构,类似二维数组。

DataFrame创建方式

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

使用列表创建

data = [['Google',10],['Runoob',12],['Wiki',13]]
df = pd.DataFrame(data=data,columns=['Site','Age'])
df

使用ndarrays创建(推荐)

data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13],'cost':[3,4,6]}
df = pd.DataFrame(data)
df

使用字典创建(不推荐)

data = [{'a': 1, 'b': 2},{'a': 5, 'b': 10, 'c': 20}]
df = pd.DataFrame(data)
df

::: info 注意
这其中出现了空值!
没有对应的部分数据为 NaN。
:::

DateFrame的取值方式

取单值返回Series

data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13],'cost':[3,4,6]}
df = pd.DataFrame(data)
df

Pandas 可以使用 loc 属性返回指定行的数据,如果没有设置索引,第一行索引为 0,第二行索引为 1,以此类推:
注意以下的区别!

data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13],'cost':[3,4,6]}
df = pd.DataFrame(data,index=['d1','d2','d3'])

print(df)
# print(df.loc[0]) 报错
# print(df.iloc[0]) 对
print(df.loc['d3'])
data = {'Site':['Google', 'Runoob', 'Wiki'], 'Age':[10, 12, 13],'cost':[3,4,6]}
df = pd.DataFrame(data)

print(df)
print(df.loc[0])

注意:以上的返回结果其实就是一个 Pandas Series 数据。

取多值返回DataFrame

data = {
  "calories": [420, 380, 390],
  "duration": [50, 40, 45]
}

# 数据载入到 DataFrame 对象
df = pd.DataFrame(data)

# 返回第一行和第二行
print(df.loc[[0, 1]])

注意:返回结果其实就是一个 Pandas DataFrame 数据。

DataFrame的操作方式

基本操作:

# 获取列
name_column = df['Name']# 注意这里没有loc 注意区分
# 获取行
first_row = df.iloc[0]
# 选择多列
subset = df[['Name', 'Age']]
# 过滤行
filtered_rows = df[df['Age'] > 30]

属性和方法:

# 获取列名
columns = df.columns
# 获取形状(行数和列数)
shape = df.shape
# 获取索引
index = df.index
# 获取描述统计信息
stats = df.describe()

数据操作:(可以用chat查参数含义)

# 添加新列
df['Salary'] = [50000, 60000, 70000]

# 删除列
df.drop('City', axis=1, inplace=True)

# 排序
df.sort_values(by='Age', ascending=False, inplace=True)

# 重命名列
df.rename(columns={'Name': 'Full Name'}, inplace=True)

从外部数据源创建 DataFrame:

# 从CSV文件创建 DataFrame
df_csv = pd.read_csv('example.csv')

# 从Excel文件创建 DataFrame
df_excel = pd.read_excel('example.xlsx')

项目: 工资分析

工资数据.csv

步骤一:数据导入

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

df_csv = pd.read_csv('./4. Pandas/工资数据.csv',encoding='utf-8')

print(df_csv)

步骤二: 取工号00027的“月份”、“实发工资”数据

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

df_csv = pd.read_csv('./第五周/工资数据.csv')

num_27=df_csv[df_csv['工号']==27]
print(num_27[['月份','实发金额']])

步骤三:取工号00027,整个2023年的“月份”、“实发工资”数据

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

df_csv = pd.read_csv('./第五周/工资数据.csv')

num_27=df_csv[df_csv['工号']==27]

num_27_2023=num_27[(num_27['月份']>="2023-01") & (num_27['月份']<"2024-01")]
print(num_27_2023[['月份','实发金额']])

步骤四:用折现图展示数据

import numpy as np
import pandas as pd
from pandas import Series,DataFrame
import matplotlib.pyplot as plt

df_csv = pd.read_csv('./第五周/工资数据.csv')

num_27=df_csv[df_csv['工号']==27]

num_27_2023=num_27[(num_27['月份']>="2023-01") & (num_27['月份']<"2024-01")]


plt.rcParams["font.family"]="SimHei"
fig=plt.figure(figsize=(6,4))
ax=fig.add_subplot()

ax.set_xlabel("月份")
ax.set_ylabel("实发工资")
ax.set_title("27号打工人23年收入")

ax.plot(num_27_2023['月份'],num_27_2023['实发金额'])

plt.show()