根据条件定位/筛选某一列的值
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
| 数据 | 年龄 |
---|
0 | 1 | 12 |
---|
1 | 2 | 23 |
---|
2 | 3 | 34 |
---|
3 | 4 | 43 |
---|
4 | 5 | 55 |
---|
5 | 6 | 51 |
---|
6 | 6 | 62 |
---|
7 | 7 | 72 |
---|
8 | 8 | 83 |
---|
9 | 9 | 92 |
---|
返回 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]
基于整张表的定位操作
- 如果前面不加 df[[“年龄”]] 或者 df[“年龄”],那么就默认是对整个 df 进行定位操作
- 可以看到返回的部分还包括其他列的部分(比如,“数据”列里面的内容也返回了)
df.loc[df["年龄"] > 38]
| 数据 | 年龄 |
---|
3 | 4 | 43 |
---|
4 | 5 | 55 |
---|
5 | 6 | 51 |
---|
6 | 6 | 62 |
---|
7 | 7 | 72 |
---|
8 | 8 | 83 |
---|
9 | 9 | 92 |
---|
根据条件修改某一列的值
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
| 数据 | 年龄 |
---|
0 | 1 | 12 |
---|
1 | 2 | 23 |
---|
2 | 3 | 34 |
---|
3 | 4 | 43 |
---|
4 | 5 | 55 |
---|
5 | 6 | 51 |
---|
6 | 6 | 62 |
---|
7 | 7 | 72 |
---|
8 | 8 | 83 |
---|
9 | 9 | 92 |
---|
基于 series 结构的修改
- 首先根据第一部分我们能够按照条件对符合条件的值的位置进行定位
- 第二步只需要给定位的位置一个赋值操作即可
- 注意:我们依然使用的是 df[“年龄”] 的结构来获得 series 结构
df["年龄"].loc[df["年龄"]>56] = 10
df
| 数据 | 年龄 |
---|
0 | 1 | 12 |
---|
1 | 2 | 23 |
---|
2 | 3 | 34 |
---|
3 | 4 | 43 |
---|
4 | 5 | 55 |
---|
5 | 6 | 51 |
---|
6 | 6 | 10 |
---|
7 | 7 | 10 |
---|
8 | 8 | 10 |
---|
9 | 9 | 10 |
---|
基于 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
| 数据 | 年龄 |
---|
0 | 1 | 12 |
---|
1 | 2 | 23 |
---|
2 | 3 | 34 |
---|
3 | 4 | 43 |
---|
4 | 5 | 55 |
---|
5 | 6 | 51 |
---|
6 | 6 | 10 |
---|
7 | 7 | 10 |
---|
8 | 8 | 10 |
---|
9 | 9 | 10 |
---|
再来一个训练实例
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
| 性别 |
---|
0 | 1 |
---|
1 | 0 |
---|
2 | 0 |
---|
3 | 0 |
---|
4 | 1 |
---|
5 | 1 |
---|
6 | 1 |
---|
7 | 1 |
---|
8 | 1 |
---|
9 | 0 |
---|
10 | 0 |
---|
11 | 1 |
---|
所有评论(0)