「pandas」Pandas 基本数据操作、 索引、赋值、排序

1 阅读5分钟

「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