「pandas」Pandas 基本数据操作、 索引、赋值、排序
「pandas」Pandas 基本数据操作、 索引、赋值、排序
更多内容请关注本人【pandas】专栏
【目录】
- 索引操作
- 赋值操作
- 排序操作
一、索引操作
score = np.random.randint(100, size=(6, 3))
names = ["同学1", "同学2", "同学3"]
period = ["期中", "期末"]
columns = ["语文", "英语", "数学"]
index = pd.MultiIndex.from_product([names, period])
df = pd.DataFrame(score, index=index, columns=columns)
print(df)
# 运行结果
语文 英语 数学
同学1 期中 65 43 91
期末 2 8 2
同学2 期中 22 44 87
期末 68 43 17
同学3 期中 6 8 50
期末 87 41 18
1.1 直接索引,行列索引(先行后列)
print(df['语文']['同学1']) # 先行后列
# 运行结果
期中 65
期末 2
Name: 语文, dtype: int32
1.2 loc函数索引
基于标签的索引器,用于通过行标签和列标签选择数据。
参数:行索引,列索引
- 单个标签(例如
df.loc['row_label', 'col_label']
) - 标签列表(例如
df.loc[['row1', 'row2'], ['col1', 'col2']]
) - 切片(例如
df.loc['row1':'row2', 'col1':'col2']
) - 布尔数组(例如
df.loc[df['col'] > 0]
)
# 单个标签
print(df["同学1", "语文"])
# 运行结果
期中 65
期末 2
Name: 语文, dtype: int32
# 标签列表
print(df.loc[["同学1", "同学2"], ["语文", "数学"]])
# 运行结果
语文 数学
同学1 期中 65 91
期末 2 2
同学2 期中 22 87
期末 68 17
# 切片
print(df.loc["同学1":"同学2", "语文": "数学"]) # 从结果上看这个是闭区间
# 运行结果
语文 英语 数学
同学1 期中 65 43 91
期末 2 8 2
同学2 期中 22 44 87
期末 68 43 17
# 布尔数组
print(df.loc[df["数学"] > 60])
# 运行结果
语文 英语 数学
同学1 期中 65 43 91
同学2 期中 22 44 87
1.3 iloc函数索引
基于位置的索引器,用于通过行和列的整数位置选择数据
参数:行索引,列索引
- 单个整数(例如
df.iloc[0, 1]
) - 整数列表(例如
df.iloc[[0, 1], [1, 2]]
) - 切片(例如
df.iloc[0:2, 1:3]
) - 布尔数组(例如
df.iloc[df['col'] > 0]
)
# 单个整数
print(df.iloc[0, 2], end='\n\n')
# 运行结果
91
# 整数列表
print(df.iloc[[0, 1], [1, 2]], end='\n\n')
# 运行结果
英语 数学
同学1 期中 43 91
期末 8 2
# 切片
print(df.iloc[0:2, 1:2], end='\n\n')
# 运行结果
英语
同学1 期中 43
期末 8
二、赋值操作
- 修改单个值
- 修改整列值
- 修改多列
- 添加新列
- 使用条件赋值
- apply、assign
- 修改行数据
- at、iat
- mask和where
# DataFrame示例
df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['x', 'y', 'z'])
# 运行结果
A B
x 1 4
y 2 5
z 3 6
2.1 修改单个值
# 使用 loc 修改单个值
df.loc['x', 'A'] = 10
# 使用 iloc 修改单个值
df.iloc[1, 1] = 20
# 运行结果
A B
x 10 4
y 2 20
z 3 6
2.2 修改整列值
df['A'] = [100, 200, 300]
# 运行结果
A B
x 100 4
y 200 20
z 300 6
2.3 修改多列
df[['A', 'B']] = [[1, 2], [3, 4], [5, 6]]
# 运行结果
A B
x 1 2
y 3 4
z 5 6
2.4 添加新列
df['C'] = [7, 8, 9]
# 运行结果
A B C
x 1 2 7
y 3 4 8
z 5 6 9
2.5 使用条件赋值
# 将列 'A' 中大于 2 的值修改为 100
df.loc[df['A'] > 2, 'A'] = 100
# 运行结果
A B C
x 1 2 7
y 100 4 8
z 100 6 9
2.6 apply、assign
- apply
# 对列 'A' 的值加倍
df['A'] = df['A'].apply(lambda x: x * 2)
# 运行结果
A B C
x 2 2 7
y 200 4 8
z 200 6 9
- assign
assign
方法可以创建新列或覆盖现有列,并返回一个新的 DataFrame(原 DataFrame 不会被修改)。
# 添加新列 'D',其值为列 'A' 和 'B' 的和
df_new = df.assign(D=df['A'] + df['B'])
# 运行结果
A B C D
x 2 2 7 4
y 200 4 8 204
z 200 6 9 206
2.7 修改行数据
# 修改行 'x' 的所有值
df.loc['x'] = [10, 20, 30]
# 运行结果
A B C
x 10 20 30
y 200 4 8
z 200 6 9
2.8 at、iat,用于快速访问和修改单个值的方法
- at : 基于标签
- iat : 基于位置
# 使用 at 修改单个值
df.at['x', 'A'] = 100
# 使用 iat 修改单个值
df.iat[1, 1] = 50
# 运行结果
A B C
x 100 20 30
y 200 50 8
z 200 6 9
2.9 mask 和 where 赋值
mask
:将满足条件的值替换为指定值。where
:将不满足条件的值替换为指定值。
# 使用 mask 将列 'A' 中大于 100 的值替换为 -1
df['A'] = df['A'].mask(df['A'] > 100, -1)
# 使用 where 将列 'B' 中小于等于 20 的值替换为 -1
df['B'] = df['B'].where(df['B'] > 20, -1)
# 运行结果
A B C
x 100 -1 30
y -1 50 8
z -1 -1 9
三、Series、 DataFrame 排序
-
Series
- 对象.sort_index(ascending=True, inplace=False)
- 对象.sort_values(ascending=True, inplace=False, na_position=‘last’)
-
DataFrame
- 对象.sort_index(axis=0, ascending=True, inplace=False)
- 对象.sort_values(by, ascending=True, inplace=False, na_position=‘last’)
-
参数解释:
- ascending : 升序, 默认 True
- inplace : 原地修改, 默认False, 则返回一个新的对象
- na_position: 缺失值的位置,
'last'
(默认)或'first'
。 by
:排序依据的列名或列名列表。
3.1 Series 排序
s = pd.Series([3, 1, 4, 1, 5], index=['a', 'b', 'c', 'd', 'e'])
# 按值升序排序
sorted_s = s.sort_values()
# 运行结果
b 1
d 1
a 3
c 4
e 5
dtype: int64
# 按索引降序排序
sorted_s = s.sort_index(ascending=False)
e 5
d 1
c 4
b 1
a 3
dtype: int64
3.2 DataFrame 排序
- 单列排序
- 多列排序
df = pd.DataFrame({
'A': [3, 1, 4, 1, 5],
'B': [9, 2, 5, 3, 8],
'C': [7, 6, 8, 4, 2]
})
# 按单列 'A' 升序排序
sorted_df = df.sort_values(by='A')
# 运行结果
A B C
1 1 2 6
3 1 3 4
0 3 9 7
2 4 5 8
4 5 8 2
# 多列排序 按列 'A' 升序,列 'B' 降序排序
sorted_df = df.sort_values(by=['A', 'B'], ascending=[True, False])
# 运行结果
A B C
3 1 3 4
1 1 2 6
0 3 9 7
2 4 5 8
4 5 8 2
# 按行索引降序排序
sorted_df = df.sort_index(ascending=False)
# 运行结果
A B C
4 5 8 2
3 1 3 4
2 4 5 8
1 1 2 6
0 3 9 7
3.3 处理缺失值
在排序时,可以通过
na_position
参数控制缺失值的位置。
# 创建一个包含缺失值的 DataFrame
df = pd.DataFrame({
'A': [3, 1, None, 1, 5],
'B': [9, 2, 5, 3, 8]
})
# 按列 'A' 排序,缺失值放在最前面
sorted_df = df.sort_values(by='A', na_position='first')
# 运行结果
A B
2 NaN 5
1 1.0 2
3 1.0 3
0 3.0 9
4 5.0 8