根据条件定位/筛选某一列的值

import pandas as pd
import numpy as np
df = pd.DataFrame(data={"数据":[1,2,3,4,5,6,6,7,8,9],"年龄":[12,23,34,43,55,51,62,72,83,92]})
df
数据年龄
0112
1223
2334
3443
4555
5651
6662
7772
8883
9992

返回 series 结构的写法

  • 因为最前面使用了 df[“年龄”] 之后才使用的 loc,所以就限定了一定是以一个 Series 结构为基础
  • loc 的意思可以理解为 location 定位,就是在选中 df[“年龄”] 这一列的情况下,进行定位操作;
df["年龄"].loc[df["年龄"] > 38]
3    43
4    55
5    51
6    62
7    72
8    83
9    92
Name: 年龄, dtype: int64

返回 dataframe 结构的写法

  • 因为 df[[“年龄”]] 这个过程中对年龄使用了两层的列表,因此默认是对一个 dataframe 结构进行操作
df[["年龄"]].loc[df["年龄"] > 38]
年龄
343
455
551
662
772
883
992

基于整张表的定位操作

  • 如果前面不加 df[[“年龄”]] 或者 df[“年龄”],那么就默认是对整个 df 进行定位操作
  • 可以看到返回的部分还包括其他列的部分(比如,“数据”列里面的内容也返回了)
df.loc[df["年龄"] > 38]
数据年龄
3443
4555
5651
6662
7772
8883
9992

根据条件修改某一列的值

df = pd.DataFrame(data={"数据":[1,2,3,4,5,6,6,7,8,9],"年龄":[12,23,34,43,55,51,62,72,83,92]})
df
数据年龄
0112
1223
2334
3443
4555
5651
6662
7772
8883
9992

基于 series 结构的修改

  • 首先根据第一部分我们能够按照条件对符合条件的值的位置进行定位
  • 第二步只需要给定位的位置一个赋值操作即可
  • 注意:我们依然使用的是 df[“年龄”] 的结构来获得 series 结构
df["年龄"].loc[df["年龄"]>56] = 10
df
数据年龄
0112
1223
2334
3443
4555
5651
6610
7710
8810
9910

基于 dataframe 结构的修改

  • 同上

Note: 这种情况是不奏效的,这是规定,因此在赋值的时候我们最好只用上面的第一种方式去写。

df[["年龄"]].loc[df["年龄"]<56]=20 
D:\Anaconda3\envs\pytorch\lib\site-packages\pandas\core\indexing.py:670: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  iloc._setitem_with_indexer(indexer, value)
D:\Anaconda3\envs\pytorch\lib\site-packages\ipykernel_launcher.py:1: SettingWithCopyWarning: 
A value is trying to be set on a copy of a slice from a DataFrame

See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy
  """Entry point for launching an IPython kernel.
df
数据年龄
0112
1223
2334
3443
4555
5651
6610
7710
8810
9910

再来一个训练实例

  • 将下列数据中的男性赋值为 1, 女性赋值为 0
df_2 = pd.DataFrame({"性别":["男","女","女","女","男","男","男","男","男","女","女","男"]})
df_2
性别
0
1
2
3
4
5
6
7
8
9
10
11
df_2["性别"].loc[df_2["性别"] == "男"] = 1
df_2["性别"].iloc[df_2["性别"] == "女"] = 0
df_2
性别
01
10
20
30
41
51
61
71
81
90
100
111

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐