Pandas 数据结构 - DataFrame

Pandas 数据结构 - DataFrame

一、DataFrame简介

DataFrame 是 Pandas 中最常用的数据结构,它是一个二维的、大小可变的、可以包含异构数据(不同类型的数据)的表格型数据结构。它既有行索引 (index),也有列索引 (columns),非常类似于 Excel 工作表或 SQL 数据库中的表。

可以把DataFrame想象成是一个字典的集合,其中每个字典代表一行数据,字典的键是列名,值是单元格数据。或者,也可以看作是由多个共享同一个索引的 Series 对象(列)组成的。

DataFrame 的主要特点:

  1. 二维表格结构: 有行和列。
  2. 异构数据: 不同的列可以包含不同类型的数据(整数、字符串、浮点数、布尔值等)。
  3. 标签化索引: 行和列都有标签(索引),方便按标签访问数据。
  4. 大小可变: 可以插入或删除行和列。
  5. 强大的数据操作: 支持合并、连接、分组、聚合、重塑、切片、索引等操作。
  6. 处理缺失数据: 内置处理缺失值(NaN)的功能。

二、创建 DataFrame

有多种方式可以创建 DataFrame:

1、从字典创建

  • 字典的 key 将成为列名。
  • 字典的 value 是列表、元组或 Series,代表该列的数据。所有 value 的长度必须相同。
python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)
print(df)

输出:

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020
2  王五   NaN  广州  2018
3  赵六  28.0  深圳  2021
  • 字典的 key 将成为行索引(需要指定 orient='index' 并配合 columns 参数)。
python 复制代码
import pandas as pd
import numpy as np

data = {
    'row1': ['张三', 25, '北京', 2019],
    'row2': ['李四', 30, '上海', 2020],
    'row3': ['王五', np.nan, '广州', 2018],
    'row4': ['赵六', 28, '深圳', 2021]
}
df = pd.DataFrame.from_dict(data, orient='index', columns=['姓名', '年龄', '城市', '入职年份'])
print(df)

输出:

python 复制代码
      姓名   年龄  城市  入职年份
row1  张三  25.0  北京    2019
row2  李四  30.0  上海    2020
row3  王五   NaN  广州    2018
row4  赵六  28.0  深圳    2021

2、从列表(或元组)的列表创建

python 复制代码
import pandas as pd
import numpy as np

data = [
    ['张三', 25, '北京', 2019],
    ['李四', 30, '上海', 2020],
    ['王五', np.nan, '广州', 2018],
    ['赵六', 28, '深圳', 2021]
]
df = pd.DataFrame(data, columns=['姓名', '年龄', '城市', '入职年份'])
print(df)

输出:

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020
2  王五   NaN  广州  2018
3  赵六  28.0  深圳  2021

3、从 NumPy 数组创建

python 复制代码
arr = np.array([
    ['张三', 25, '北京', 2019],
    ['李四', 30, '上海', 2020],
    ['王五', np.nan, '广州', 2018],
    ['赵六', 28, '深圳', 2021]
])
df = pd.DataFrame(arr, columns=['姓名', '年龄', '城市', '入职年份'])
print(df) # 注意:此时'年龄'和'入职年份'列的数据类型可能是object(字符串),因为NumPy数组要求元素类型一致。通常需要后续转换类型。

输出:

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020
2  王五   NaN  广州  2018
3  赵六  28.0  深圳  2021

4、从 Series 的字典创建

python 复制代码
s_name = pd.Series(['张三', '李四', '王五', '赵六'], name='姓名')
s_age = pd.Series([25, 30, np.nan, 28], name='年龄')
s_city = pd.Series(['北京', '上海', '广州', '深圳'], name='城市')
s_year = pd.Series([2019, 2020, 2018, 2021], name='入职年份')

df = pd.DataFrame({s_name.name: s_name, s_age.name: s_age, s_city.name: s_city, s_year.name: s_year})
print(df)

输出:

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020
2  王五   NaN  广州  2018
3  赵六  28.0  深圳  2021

5、从文件创建 (常用)

Pandas 提供了强大的文件读取函数,如 pd.read_csv(), pd.read_excel(), pd.read_sql() 等。

python 复制代码
# employees.csv
姓名,年龄,城市,入职年份
张三,25,北京,2019
李四,30,上海,2020
王五,,广州,2018
赵六,28,深圳,2021
python 复制代码
# 假设有一个名为 'employees.csv' 的文件
df = pd.read_csv('employees.csv')  # 读取 CSV 文件
# df = pd.read_excel('employees.xlsx') # 读取 Excel 文件
print(df.head(2))  # 查看前2行

输出

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020

三、查看 DataFrame 的基本信息

1、查看头部/尾部

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

print(df.head(2))  # 查看前 2 行
print(df.tail(1))   # 查看最后 1 行

输出:

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020
   姓名    年龄  城市  入职年份
3  赵六  28.0  深圳  2021

2、查看索引、列名和形状

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

print('行索引:', df.index)    # 行索引
print('列名:', df.columns)  # 列名
print('行数,列数:', df.shape)    # (行数, 列数)

输出:

python 复制代码
行索引: RangeIndex(start=0, stop=4, step=1)
列名: Index(['姓名', '年龄', '城市', '入职年份'], dtype='object')
行数,列数: (4, 4)

3、查看数据类型

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

print(df.dtypes)

输出:

python 复制代码
姓名       object # 文本/字符串
年龄      float64 # 浮点类型,由于年龄中有NaN值,NaN在技术上是浮点数类型
城市       object
入职年份      int64 # 整数类型
dtype: object

4、查看统计摘要 (数值列)

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

print(df.describe())

输出:

python 复制代码
           年龄        入职年份
count   3.000000   4.000000  # 非缺失值数量
mean   27.666667  2019.500000 # 平均值
std     2.516611     1.290994 # 标准差
min    25.000000  2018.000000 # 最小值
25%    26.500000  2018.750000 # 25%分位数
50%    28.000000  2019.500000 # 中位数 (50%分位数)
75%    29.000000  2020.250000 # 75%分位数
max    30.000000  2021.000000 # 最大值

注意:describe() 默认只统计数值列。使用 df.describe(include='all') 可以尝试包含非数值列(但统计信息可能不完整)。

5、查看是否有缺失值

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

print("df.info()输出")
print(df.info())      # 显示数据类型和非空值数量,可推断缺失值

print("df.isnull()输出")
print(df.isnull())    # 返回一个相同形状的布尔DataFrame,True表示缺失

print("df.isnull().sum()输出")
print(df.isnull().sum()) # 每列的缺失值数量

输出:

python 复制代码
-------------------- df.info()输出--------------------
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 4 entries, 0 to 3
Data columns (total 4 columns):
 #   Column  Non-Null Count  Dtype  
---  ------  --------------  -----  
 0   姓名      4 non-null      object 
 1   年龄      3 non-null      float64
 2   城市      4 non-null      object 
 3   入职年份    4 non-null      int64  
dtypes: float64(1), int64(1), object(2)
memory usage: 256.0+ bytes
None
-------------------- df.isnull()输出--------------------
      姓名     年龄     城市   入职年份
0  False  False  False  False
1  False  False  False  False
2  False   True  False  False
3  False  False  False  False
-------------------- df.isnull().sum()输出--------------------
姓名      0
年龄      1
城市      0
入职年份    0
dtype: int64

四、数据选择与索引

1、按列名选择 (返回 Series 或 DataFrame)

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 选择单列 (返回 Series)
ages = df['年龄']
print(ages)
# 或者 (点号访问,列名必须是有效的变量名,且无歧义)
ages = df.年龄

# 选择多列 (返回 DataFrame)
sub_df = df[['姓名', '城市']]
print(sub_df)

输出:

python 复制代码
0    25.0
1    30.0
2     NaN
3    28.0
Name: 年龄, dtype: float64
   姓名  城市
0  张三  北京
1  李四  上海
2  王五  广州
3  赵六  深圳

2、按行索引选择 (标签索引 - .loc[])

.loc[] 主要基于标签。

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 选择单行 (返回 Series)
row1 = df.loc[0]  # 选择索引为0的行
print(row1)

# 选择多行 (返回 DataFrame)
rows = df.loc[[0, 2]] # 选择索引为0和2的行
print(rows)

# 选择行范围 (标签切片,包含结束标签)
rows_range = df.loc[1:3] # 选择索引为1到3的行 (包含3)
print(rows_range)

# 同时选择行和列 (行在前,列在后,用逗号分隔)
cell = df.loc[0, '年龄']  # 选择索引0行,'年龄'列的值
sub_df = df.loc[[0, 2], ['姓名', '城市']] # 选择索引0,2行,姓名、城市列
sub_df_range = df.loc[1:3, '城市':'入职年份'] # 选择索引1-3行,城市到入职年份列

输出:

python 复制代码
姓名        张三
年龄      25.0
城市        北京
入职年份    2019
Name: 0, dtype: object
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
2  王五   NaN  广州  2018
   姓名    年龄  城市  入职年份
1  李四  30.0  上海  2020
2  王五   NaN  广州  2018
3  赵六  28.0  深圳  2021

3、按行位置选择 (整数位置索引 - .iloc[])

.iloc[] 主要基于整数位置(从0开始)。

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 选择单行
row0 = df.iloc[0]  # 第0行 (第一行)
print(row0)

# 选择多行
rows = df.iloc[[0, 2]] # 第0行和第2行
print(rows)

# 选择行范围 (位置切片,不包含结束位置)
rows_range = df.iloc[1:3] # 第1行到第2行 (不包含3)

# 同时选择行和列
cell = df.iloc[0, 1]       # 第0行,第1列 (索引从0开始)
sub_df = df.iloc[[0, 2], [0, 2]] # 第0,2行,第0,2列
sub_df_range = df.iloc[1:3, 1:3] # 第1-2行,第1-2列

输出:

python 复制代码
姓名        张三
年龄      25.0
城市        北京
入职年份    2019
Name: 0, dtype: object
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
2  王五   NaN  广州  2018

4、布尔索引 (条件筛选)

根据列值的条件筛选行。

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 年龄大于28岁的员工
older_than_28 = df[df['年龄'] > 28]
print(older_than_28)

# 在北京或上海工作的员工
in_bj_or_sh = df[df['城市'].isin(['北京', '上海'])]
print(in_bj_or_sh)

# 年龄缺失的员工
missing_age = df[df['年龄'].isnull()]
print(missing_age)

# 组合条件: 年龄小于30岁 且 在深圳工作的员工 (使用 &, |, ~ 表示 and, or, not)
young_in_sz = df[(df['年龄'] < 30) & (df['城市'] == '深圳')]
print(young_in_sz)

输出:

python 复制代码
   姓名    年龄  城市  入职年份
1  李四  30.0  上海  2020
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
1  李四  30.0  上海  2020
   姓名  年龄  城市  入职年份
2  王五 NaN  广州  2018
   姓名    年龄  城市  入职年份
3  赵六  28.0  深圳  2021

五、数据操作

1、添加新列

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 直接赋值 (列名不存在则新增)
df['性别'] = ['男', '男', '男', '女']  # 必须提供与行数相同长度的数据

# 基于现有列计算
df['出生年份'] = 2023 - df['年龄']  # 注意:年龄列有NaN,计算结果也会有NaN
print(df)

输出:

python 复制代码
   姓名    年龄  城市  入职年份 性别    出生年份
0  张三  25.0  北京  2019  男  1998.0
1  李四  30.0  上海  2020  男  1993.0
2  王五   NaN  广州  2018  男     NaN
3  赵六  28.0  深圳  2021  女  1995.0

2、修改列

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 修改整个列
df['城市'] = ['Beijing', 'Shanghai', 'Guangzhou', 'Shenzhen'] # 全列替换

# 修改符合条件的单元格 (结合.loc[]或.iloc[])
df.loc[df['姓名'] == '王五', '年龄'] = 27  # 将王五的年龄改为27 (原来为NaN)
print(df)

输出:

python 复制代码
   姓名    年龄         城市  入职年份
0  张三  25.0    Beijing  2019
1  李四  30.0   Shanghai  2020
2  王五  27.0  Guangzhou  2018
3  赵六  28.0   Shenzhen  2021

3、删除行或列

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

df['性别'] = ['男', '男', '男', '女']  # 必须提供与行数相同长度的数据
df['出生年份'] = 2023 - df['年龄']  # 注意:年龄列有NaN,计算结果也会有NaN

# 删除列 (axis=1 表示列)
df_drop_col = df.drop('出生年份', axis=1)  # 删除'出生年份'列,返回新DataFrame (原df不变)
df_drop_cols = df.drop(['入职年份', '性别'], axis=1)  # 删除多列

# 删除行 (axis=0 表示行)
df_drop_row = df.drop(2)  # 删除索引为2的行
df_drop_rows = df.drop([0, 3]) # 删除索引为0和3的行

# 如果要修改原DataFrame,使用 inplace=True
df.drop('出生年份', axis=1, inplace=True)  # 直接在df上删除列
print(df)

输出:

python 复制代码
   姓名    年龄  城市  入职年份 性别
0  张三  25.0  北京  2019  男
1  李四  30.0  上海  2020  男
2  王五   NaN  广州  2018  男
3  赵六  28.0  深圳  2021  女

4、处理缺失值

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', np.nan],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

# 删除包含缺失值的行
df_no_missing = df.dropna()  # 删除任何列包含NaN的行
df_no_missing_age = df.dropna(subset=['年龄'])  # 只删除'年龄'列是NaN的行
print(df_no_missing_age)

# 填充缺失值
df_fill_mean = df.fillna(df['年龄'].mean())  # 用年龄列的均值填充所有NaN (不常用)
df['年龄'].fillna(df['年龄'].mean(), inplace=True) # 用均值填充年龄列的NaN
df['城市'].fillna('未知', inplace=True) # 用'未知'填充城市列的NaN (如果城市列有缺失)
print(df['年龄'])
print(df['城市'])

输出:

python 复制代码
   姓名    年龄   城市  入职年份
0  张三  25.0   北京  2019
1  李四  30.0   上海  2020
3  赵六  28.0  NaN  2021
0    25.000000
1    30.000000
2    27.666667
3    28.000000
Name: 年龄, dtype: float64
0    北京
1    上海
2    广州
3    未知
Name: 城市, dtype: object

5、数据合并

Pandas 提供了多种合并方法 (pd.concat, pd.merge)。这里展示简单的 concat

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', np.nan],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

data2 = {
    '姓名': ['钱七', '孙八'],
    '年龄': [32, 29],
    '城市': ['杭州', '南京'],
    '入职年份': [2017, 2022]
}
df2 = pd.DataFrame(data2)

# 按行合并 (上下堆叠),注意列名要一致
df_combined = pd.concat([df, df2], ignore_index=True)  # ignore_index=True 重置索引
print(df_combined)

输出:

python 复制代码
   姓名    年龄   城市  入职年份
0  张三  25.0   北京  2019
1  李四  30.0   上海  2020
2  王五   NaN   广州  2018
3  赵六  28.0  NaN  2021
4  钱七  32.0   杭州  2017
5  孙八  29.0   南京  2022

六、常用函数与方法

1、基础操作

数据查看

  • 查看头部/尾部数据

    python 复制代码
    df.head(n)  # 查看前n行,默认5行
    df.tail(n)  # 查看后n行,默认5行
  • 查看基本信息

    python 复制代码
    df.info()     # 数据类型、非空值统计
    df.describe() # 数值型列的统计摘要(均值、标准差等)
    df.shape      # 返回行数和列数,例如 (100, 5)

数据筛选

  • 列选择

    python 复制代码
    df['列名']        # 选择单列 → Series
    df[['列A', '列B']] # 选择多列 → DataFrame
  • 行选择

    python 复制代码
    df.loc[行标签]          # 按标签选择行
    df.iloc[行索引]         # 按位置选择行
    df[df['列'] > 值]      # 按条件筛选行

排序

python 复制代码
df.sort_values('列名', ascending=False)  # 按列值降序排序
df.sort_index()                          # 按索引排序

2、 数据处理

增删改列

  • 新增列

    python 复制代码
    df['新列'] = df['列A'] + df['列B']  # 直接赋值
  • 删除列

    python 复制代码
    df.drop('列名', axis=1, inplace=True)  # 删除单列
    df.drop(['列A','列B'], axis=1)         # 删除多列
  • 重命名列

    python 复制代码
    df.rename(columns={'旧列名':'新列名'}, inplace=True)

处理缺失值

python 复制代码
df.dropna()      # 删除包含NaN的行
df.fillna(0)     # 将NaN填充为0
df.isnull()      # 检测缺失值 → 返回布尔矩阵
df.notnull()     # 检测非缺失值

类型转换

python 复制代码
df['列名'] = df['列名'].astype('int')  # 转换为整型

3、数据统计

基本统计

python 复制代码
df.sum()      # 列求和
df.mean()     # 列平均值
df.median()   # 列中位数
df.max()      # 列最大值
df.min()      # 列最小值
df.std()      # 列标准差

分组聚合

python 复制代码
df.groupby('分组列')['聚合列'].mean()  # 按分组列计算聚合列的平均值
df.groupby('列A').agg({'列B':'sum', '列C':'max'})  # 多列不同聚合方式

4、 数据合并

合并DataFrame

python 复制代码
pd.concat([df1, df2], axis=0)  # 纵向拼接(增加行)
pd.concat([df1, df2], axis=1)  # 横向拼接(增加列)
pd.merge(df1, df2, on='键列')   # 按列合并(类似SQL JOIN)

5、 其他实用技巧

  • 应用函数

    python 复制代码
    df['列'].apply(lambda x: x*2)  # 对列应用函数
  • 重置索引

    python 复制代码
    df.reset_index(drop=True)  # 重置索引并丢弃原索引
  • 设置索引

    python 复制代码
    df.set_index('列名', inplace=True)  # 将某列设为索引

示例代码

分组聚合 (groupby)

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

grouped = df.groupby('城市')
avg_age_by_city = grouped['年龄'].mean()
print(avg_age_by_city)

# 按城市分组,统计每个城市的人数
count_by_city = grouped.size()
print(count_by_city)

# 按城市分组,同时计算平均年龄和最小入职年份
agg_result = grouped.agg({
    '年龄': 'mean',
    '入职年份': 'min'
})
print(agg_result)

输出:

python 复制代码
城市
上海    30.0
北京    25.0
广州     NaN
深圳    28.0
Name: 年龄, dtype: float64
城市
上海    1
北京    1
广州    1
深圳    1
dtype: int64
      年龄  入职年份
城市            
上海  30.0  2020
北京  25.0  2019
广州   NaN  2018
深圳  28.0  2021

排序 (sort_values)

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

df_sorted_age = df.sort_values('年龄')
print(df_sorted_age)

# 按入职年份降序排序
df_sorted_year = df.sort_values('入职年份', ascending=False)
print(df_sorted_year)

# 先按城市升序,城市相同按年龄降序
df_sorted_multi = df.sort_values(['城市', '年龄'], ascending=[True, False])
print(df_sorted_multi)

输出:

python 复制代码
   姓名    年龄  城市  入职年份
0  张三  25.0  北京  2019
3  赵六  28.0  深圳  2021
1  李四  30.0  上海  2020
2  王五   NaN  广州  2018
   姓名    年龄  城市  入职年份
3  赵六  28.0  深圳  2021
1  李四  30.0  上海  2020
0  张三  25.0  北京  2019
2  王五   NaN  广州  2018
   姓名    年龄  城市  入职年份
1  李四  30.0  上海  2020
0  张三  25.0  北京  2019
2  王五   NaN  广州  2018
3  赵六  28.0  深圳  2021

应用函数 (apply)

python 复制代码
import pandas as pd
import numpy as np

# 字典的value是列表
data = {
	'姓名': ['张三', '李四', '王五', '赵六'],
	'年龄': [25, 30, np.nan, 28],  # 使用np.nan表示缺失值
	'城市': ['北京', '上海', '广州', '深圳'],
	'入职年份': [2019, 2020, 2018, 2021]
 }
df = pd.DataFrame(data)

df['姓名大写'] = df['姓名'].apply(lambda x: x.upper())

# 定义一个函数,根据年龄判断是否年轻 (假设<30为年轻)
def is_young(age):
    if age < 30:
        return 'Young'
    else:
        return 'Not Young'

df['年龄段'] = df['年龄'].apply(is_young)  # 注意处理NaN
print(df)

输出:

python 复制代码
   姓名    年龄  城市  入职年份 姓名大写        年龄段
0  张三  25.0  北京  2019   张三      Young
1  李四  30.0  上海  2020   李四  Not Young
2  王五   NaN  广州  2018   王五  Not Young
3  赵六  28.0  深圳  2021   赵六      Young

以下是 pandasDataFrame 常用操作和方法的总结:

相关推荐
倔强的小石头_21 小时前
Python 从入门到实战(十):Pandas 数据处理(高效搞定表格数据的 “瑞士军刀”)
人工智能·python·pandas
万粉变现经纪人1 天前
Python系列Bug修复PyCharm控制台pip install报错:如何解决 pip install 网络报错 企业网关拦截 User-Agent 问题
网络·python·pycharm·beautifulsoup·bug·pandas·pip
Lucky高2 天前
Pandas库实践1_预备知识准备
python·pandas
墨上烟雨2 天前
Pandas 数据结构 - Series
数据结构·pandas
狮智先生2 天前
【编程实践】PySide6 + Plotly + Pandas 开发HTML数据分析报告
程序人生·plotly·html·pandas
陈天伟教授3 天前
人工智能训练师认证教程(3)Pandas数据世界的军刀
人工智能·数据分析·pandas
我才是一卓3 天前
【pip】解决 pip install pandas 时 subprocess-exited-with-error 错误
pandas·pip
子夜江寒3 天前
pandas基础操作
学习·pandas
dazzle3 天前
《DataFrame可视化与高级方法》
python·pandas