pandas选择单元格,选择行列
首先创建示例df:
df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'), index=list('5678'))
df:
A B C D
5 0 1 2 3
6 4 5 6 7
7 8 9 10 11
8 12 13 14 15
注意:df的index是str类型,如果不指定index默认是0开始的int类型
分为如下几个方面进行讨论:
1)loc,行名称列名称
2)iloc,行数列数
3)ix,行名称列名称/行数列数混合
4)df[]
5) df.x,选择单列
6)Series的筛选方法
7)bool
8)reindex
1,loc,行名称列名称
1.1,行
df.loc['6'] # 行名称为6的行,即第2行,即4 5 6 7
df.loc['5':'7'] # 行名称为5至7的行,即前3行,注意是前闭后闭
df.loc[['5', '7']] # 行名称为5和7的行,前第1第3行
1.2,列
df.loc[:, 'B'] # 列名称为'B‘的列,即第2列,1 5 9 13
df.loc[:, 'A':'C'] # 列名称为A至C的列,即前3列,注意是前闭后闭
df.loc[:, ['A', 'C']] # 列名称为A和C的列,即第1列第3列
1.3,块
df.loc['5':'7', 'A':'C'] # 行名称为5至7,列名称为A~C的一块数据,即前3行前3列
df.loc[['5', '7'], ['A', 'C']] # 行名称为5和7,列名称为A和C的一块数据
df.loc['5':'7', ['A', 'C']] # 行名称5至7,列名称A和C的一块数据
df.loc[['5', '7'], 'A':'C'] # 行名称为5和7,列名称为A~C的一块数据
1.4,单元格
df.loc['5', 'A'] # 行名称为5,列名称为A的单元格数据
df.at['5', 'A'] # 同loc但速度快点
2,iloc,行数列数
2.1,行
df.iloc[1] # 第2行,即行名称为6的行,4 5 6 7
df.iloc[0:3] # 前3行
df.iloc[[0, 3]] # 第1第4行
2.2,列
df.iloc[:, 1] # 第2列,即列名称为'B'的列,1 4 9 13
df.iloc[:, 0:3] # 前3列
df.iloc[:, [0, 3]] # 第1第4列
2.3,块
df.iloc[0:3, 0:3] # 前3行,前3列的一块数据
df.iloc[[0, 3], [0, 3]] # 第1第4行,第1第4列的一块数据
df.iloc[0:3, [0, 3]] # 前3行,第1第4列的一块数据
df.iloc[[0, 3], 0:3] # 第1第4行,前3列的一块数据
2.4,单元格
df.iloc[1, 1] # 第1行,第1列的单元格
df.iat[1, 1] # 同iloc但速度快点
3.1,行
df.ix['7'] # 单行,下同
df.ix[2]
df.ix[1: 3] # 多行,下同
df.ix[[1, 3]]
df.ix['5':'7']
df.ix['5', '7']
如果是行/列的名称是int类型时,只能根据行/列名称选,不能根据行数/列数选:
df.index = range(1, 5)
df.ix[2] # 输出是行名称为2的行,根据行数选择应该是第3行
df.index = range(11, 15)
df.ix[2] # KeyError: 2
3.2,列
df.ix[:, 'C'] # 单列,下同
df.ix[:, 2]
df.ix[:, 1: 3] # 多列,下同
df.ix[:, [1, 3]]
df.ix[:, 'A':'C']
df.ix[:, ['A','C']]
3.3,块(略)
多行和多列的排列组合
3.4,单元格(略)
单行和单列的排列组合
4.1,行
可以接收行名称或者行数,但必须是切片
df[0:1] # 第1行
df[0:3] # 前3行
df['5':'5'] # 行名称为5的行
df['5':'7'] # 行名称为5的行至行名称为7的行
行数切片时,如果行索引类型为int,则会根据行数来切片,不会根据行名称切片,这点与df.ix不同,例如:
df = pd.DataFrame(np.arange(16).reshape(4, 4), columns=list('ABCD'), index=range(5, 9))
df[5:8] # Empty DataFrame
df[0:3] # 第1至第3行
4.2,列
只能接收列名称,可以是单个或列表
df['A'] # A列
df[['A', 'C']] # A和C列
4.3,块
df[]无法选择块
4.4,单元格
df[]无法选择单元格
5,df.x
df.A # A列
上述示例中,接收参数为单个标签或索引的筛选,返回的都是Series,例如:
df.iloc[1]
df.iloc[:, 2]
df.loc['5']
df.loc[:, 'B']
df.ix[2]
df.ix[:, 'C']
df['A']
df.A
接收参数为切片或列表的筛选,即使只有一行/一列数据,返回的都是DataFrame:
df[0:1]
df['5': '5']
df.iloc[[1]]
df.loc[:, ['B']]
df[['A']]
因此,如果想获取单行/单列数据的DataFrame,只需要将输入的单个标签或索引改为切片或列表
可以进一步在Series中筛选值,以A列的Series为例:
>>> df['A']
5 0
6 4
7 8
8 12
Name: A, dtype: int32
筛选出Series中第二个值4的方法有:
df['A'].iloc[1]
df['A'].loc['6']
df['A'].ix[1]
df['A'].ix['6']
df['A'][1]
df['A'].values[1]
7,bool
7.1,bool列表
上述示例中,DataFrame或者Series可以接受切片/列表参数的地方,都可以接受bool列表,保留bool列表中真值对应的项目,例如:
生成bool列表:
chooses = [True, False, True, False]
chooses = [i == 0 or i == 8 for i in df['A']] # 结果是[True, False, True, False]
根据bool列表筛选:
df.iloc[chooses] # 只留第1第3行
df.loc[:, chooses] # 只留第1第3列
df.ix[chooses] # 只留第1第3行
df[chooses] # 只留第1第3行
df['A'][chooses] # 只留A列中第1第3个值
7.2,bool Series
可以根据bool Series筛选,保留bool Series真值对应的项目,但是index要与df相同
1)按列生成的Series,index是原df的index,可以对行方向操作进行筛选
生成列方向的bool Series:
chooses = pd.Series([True, False, True, False], index=df.index)
chooses = df.loc[:, 'A'] > 1
chooses = df.iloc[:, 0] > 1
chooses = df['A'] > 1
chooses = df['A'] == 4
chooses = ~(df.A == 4) # 可以直接取反,等效df.A != 4
chooses = ~(df['A'] > 1)
chooses = df['A'].isin(range(9)) # A列的值是否在range(9)中
chooses = (df['A'].isin(range(9))) & (df['B'] > 1) # bool Series的&运算,即同时满足A列range(9)内,B列大于1
根据bool Series可以在行方向做筛选,iloc用不了:
print(chooses.index) # Index(['1', '2', '3', '4'], dtype='object')
df[chooses] # DataFrame[]
df.A[chooses] # Series[]
df.loc[chooses] # loc
df.iloc[chooses] # 应用在iloc会报错,ValueError
df = df.ix[chooses] # ix
df = df.loc[:, chooses] # 应用在列方向会报错,pandas.core.indexing.IndexingError
如果有多个bool Series可以用“|”(或),“&”(和),例如:
df[(chooses1) | (chooses2)]
df[(chooses1) & (chooses2)]
2)按行生成的Series,index是原df的columns,可以对列方向操作进行筛选
生成行方向的bool Series:
chooses = pd.Series([True, False, True, False], index=df.columns)
chooses = df.loc['1'] > 1
chooses = df.iloc[0] > 1
根据bool Series可以在列方向做筛选,iloc用不了:
print(choose.index) # Index(['A', 'B', 'C', 'D'], dtype='object')
df.loc[:, chooses] # loc
df.iloc[:, chooses] # 应用在iloc会报错,ValueError
df.ix[:, chooses] # ix
df.loc[chooses] # 应用在行方向报错,pandas.core.indexing.IndexingError
7.3,bool DataFrame
DataFrame可以根据bool DataFrame进行筛选,保留bool DataFrame真值对应的值,其余值置为NaN
生成bool DataFrame:
chooses = df > 5
根据bool DataFrame进行筛选:
df[chooses]
8,reindex
DataFrame.reindex也可以用来对行/列进行筛选,它不会修改原DataFrame,需另存副本:
df.reindex(index=list('67')) # 筛选出行名称为6和7的行
df.reindex(columns=list('BC')) # 筛选出列名称为B和C的列
9,获取行名称/列名称
有时需要获取符合条件的行名称或者列名称
9.1,通过Series获取
可以先获取行/列所在的Series,再获取该Series对应的name:
df.iloc[1].name # 第2行的name,'6'
df.iloc[:, 1].name # 第2列的name,'B'
9.2,通过DataFrame获取
通过筛选获得的DataFrame,可以直接获index,columns
df_sub = df[df['A'] > 4]
df_sub.index # Index(['7', '8'], dtype='object')
df_sub.columns # Index(['A', 'B', 'C', 'D'], dtype='object')
df_sub.index.tolist() # ['7', '8']
df_sub.columns.tolist() # ['A', 'B', 'C', 'D']
10,缺失值处理
df.dropna(axis=0, how='any') # 行里有缺失值就丢掉,如果行里所有值是缺失值才丢掉可以how='all'
df.dropna(axis=1, how='any') # 列里有缺失值就丢掉
df.fillna(value=0) # 将缺失值填为0
df.isnull() # 整个df是否有缺失值的情况,返回结果是df
np.any(df.isnull())=True) # 只要包含有缺失值就返回True,结果是一个bool值
欢迎转载博客文章,转载请标明出处!
pandas选择单元格,选择行列的更多相关文章
- easyui datagrid单击单元格选择此列
示例代码实现单击jquery easyui datagrid的单元格时,取消datagrid默认选中高亮此行的样式,改为选中单击的单元格所在的列,高亮此列上的所有单元格.可以配置全局single变量, ...
- NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)
因工作需要用到跨合并单元格获取数据,所以写了个NPOI扩展类. 主要方法如下: 1.判断指定行/列索引(单元格)是否为合并单元格. 2.获取指定列索引的实际含有数据的单元格. 3.返回指定行/列索引的 ...
- 在DBGrid中,单击单元格选择整行,双击又可编辑单元格
在设计过程中,有时候数据较大量,field 较多的时候,只是点击单元格可能会对某个field的数据误操作(如数据错行),为此才会想到这个问题,解决办法如下:点击单元格就改当前行颜色. 首先DBGRID ...
- EasyUI datagrid 选择单元格 出现文本框 修改 四
@disabled = "disabled", 只读属性 数据初始化 public JsonResult RateList(string dispatch_number, stri ...
- pandas 设置单元格的值
import pandas as pd import pickle import numpy as np dates = pd.date_range() df = pd.DataFrame(np.ar ...
- MFC的CListCtrl双击获取单元格的行列
首先要把ClistCtrl设置为整选中模式和网格模式 SetExtendedStyle(LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); 重写方法如下: void CAl ...
- Pandas提取单元格的值
如提取第1行,第2列的值: df.iloc[[0],[1]] 则会返回一个df,即有字段名和行号. 如果用values属性取值: df.iloc[[0],[1]].values 返回的值会是列表,而且 ...
- 原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板
原创:用VBA实现将鼠标选择的单元格按照指定格式合并并复制到剪切板 一.主要实现以下功能:1.用鼠标选择单元格(可谓连续单元格,也可为不连续的)后,按照要求格式“证件号码:+选定内容+“,”+”选定内 ...
- c#操作Excel模板,替换命名单元格或关键字形成报表
c#操作Excel模板,替换命名单元格或关键字形成报表 http://blog.sina.com.cn/s/blog_45eaa01a0102vqma.html一 建立Excel 模板文件 templ ...
随机推荐
- vector at()函数比 []运算符操作安全
转载:https://blog.csdn.net/chenjiayi_yun/article/details/18507659 []操作符的源码 reference operator[](size_t ...
- vector.resize 与 vector.reserve的区别(转载)
转载:https://blog.csdn.net/shuilan0066/article/details/3588478 reserve是容器预留空间,但并不真正创建元素对象,在创建对象之前,不能引用 ...
- topcoder srm 510 div1
problem1 link 令$f(x)$表示[0,x]中答案的个数.那么题目的答案为$f(b)-f(a-1)$ 对于$f(x)$来说,假设$x$有$d$位数字,即$[0,d-1]$,那么可以进行动态 ...
- ODAC(V9.5.15) 学习笔记(五)TSmartQuery
TSmartQuery是相对于TOraQuery更简洁的数据集,其成员如下 名称 类型 说明 Expand Boolean 缺省为False,如果为True,则表示无论SQL中罗列的字段是哪些,数据集 ...
- Golang中使用kafka
golang中比较好用的kafka client有 sarama confluent-kafka-go go_kafka_client optiopay-kafka siesta 其中 sarama的 ...
- SPOJ 687 REPEATS - Repeats
题意 给定字符串,求重复次数最多的连续重复子串 思路 后缀数组的神题 让我对着题解想了快1天 首先考虑一个暴力,枚举循环串的长度l,然后再枚举每个点i,用i和i+l匹配,如果匹配长度是L,这个循环串就 ...
- P1948 [USACO08JAN]电话线Telephone Lines(二分答案+最短路)
思路 考虑题目要求求出最小的第k+1大的边权,想到二分答案 然后二分第k+1大的边权wx 把所有边权<=wx的边权变为0,边权>wx的边权变为0,找出最短路之后,如果dis[T]<= ...
- FZU 2150 Fire Game(点火游戏)
FZU 2150 Fire Game(点火游戏) Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description - 题目描述 ...
- js运算符的一些特殊应用
作者: 小文 来源: http://www.cnblogs.com/daysme/ 时间: 2017/3/2 17:21:03 本文集合了了js运算符的一些特殊应用. js位运行符的运用. js运算符 ...
- 跳跳虎回家(国庆10.1模拟赛T2)
题目: [题目描述] 跳跳虎在外面出去玩忘了时间,现在他需要在最短的时间内赶回家. 跳跳虎所在的世界可以抽象成一个含有 n 个点的图(点编号从 1 到 n ),跳跳虎现在在 1 号点,跳跳虎的家在 n ...