Pandas(1):数据选取/条件筛选小结
小结一下Pandas 筛选表格数据子集的方法作为速查手册……实际中数据处理分析及可视化往往只是数据表的一部分,因此经常需要进行:选取特定位置、特定日期、特定数值(如文本、空值)、或者满足若干组合条件的行、列等处理,这里简单汇总一下主要有以下几类,理论上基于代码我们可以实现任何想得到的处理:
- 位置筛选(与表中数值无关,仅取决于行列号或行列名),最常用df.iloc[ , ]
- 条件筛选df.loc[条件](与数值相关,根据若干符合条件(特定值或范围)选取数据子集)
- 复杂条件筛选(自定义函数df.apply的运用)
数据预览
日常涉及数据类型主要有:数字、字符串、时间日期格式。
测试数据导入及查看基本信息
1 | import pandas as pd |
位置筛选
Python默认从
0
开始索引.
行列号切片
切片时选取\([a,b]\)默认为 数学中的左闭右开\([a,b)\),因此总的个数为\(b-a\)个
一般情况单列返回类型Series,多列或多行则返回DataFrame
大多数情况,可以访问也可以修改值
主要函数:df.iloc[], df.iat[], df.at[]
原则:传入一个值或一个list时返回若干行;传入两个参数时,返回对应行及列的筛选
1 | # 一个参数 |
选择某一列值对应同行的单个其他值
1 | # 这张表有很多列,我想根据城市挨个获取其对应的省份id |
创建新行列
df创建列:直接df[]新建,右侧为值或者series或series的元组
1 | df['列1'] = ...# 新建一列 |
df新建行:或者追加一个同样的dataframe及多行,简单示意,更多的关于表格拼接和合并单写,需注意==列名及个数一致==。
1 | # 新建一个表格并追加一行数据 |
条件筛选行df.loc
多个条件使用: 与(&), 或(|), 非(!), 及取反(~)/即补集,
主要函数df.loc,条件过多或繁琐则参考第三节apply
条件筛选的实质是先根据条件生成一个这样的数组:[True, False, False,...],再根据这个数组匹配
特定值
1 | Con = df['Comment'].isna() # na值筛选 |
范围值
1 | Con = df['hour']==3 |
复杂条件筛选
个人建议通过类似 df.apply(lambda x: myfun(x)) 的方式实现
即自定义一个新的函数生成新列,再筛选,如:
1 | def myfun(x): |
有几种形式,一种是单列输入单输出,这里的lambda x就是每一行的该列(df[col])的值
- df[newcol] = df[col].apply(lambda x: myfun(x))
有时候需要多列参与运算,结果是返回单个值
如函数为myfun(x, y),即有多个输入,这种情况x是代表一行,建议写成row,因此需要指定值
- df[col] = df.apply(lambda row: myfun(row[col1],row[col2]), axis=1)
1 | df['datetime'] = df.apply(lambda row: datetime(row.year, row.month, row.day, row.hour), axis=1) |
如果输入输出都得是多列的,则需要通过zip函数拆包并新建多个列来接收,
举例df[],df[]... = zip(*df.apply())
:其他情况类推
1 | def myfun(x,y): |
关于更多函数的运用后续小结