python--pandas切片

pandas的切片操作是python中数据框的基本操作,用来选择数据框的子集。

环境

  • python3.9
  • win10 64bit
  • pandas==1.2.1

准备数据

import pandas as pd
player_list = [[1,'M.S.Dhoni', 36, 75, 5428000],
               [2,'A.B.D Villers', 38, 74, 3428000],
               [3,'V.Kholi', 31, 70, 8428000],
               [4,'S.Smith', 34, 80, 4428000],
               [5,'C.Gayle', 40, 100, 4528000],
               [6,'J.Root', 33, 72, 7028000],
               [7,'K.Peterson', 42, 85, 2528000]]
index=pd.date_range('2020',periods=7,freq='D').map(lambda x:x.date().__str__())
df = pd.DataFrame(player_list, columns=['Id','Name', 'Age', 'Weight', 'Salary'],index=index)
print(df)
            Id           Name  Age  Weight   Salary
2020-01-01   1      M.S.Dhoni   36      75  5428000
2020-01-02   2  A.B.D Villers   38      74  3428000
2020-01-03   3        V.Kholi   31      70  8428000
2020-01-04   4        S.Smith   34      80  4428000
2020-01-05   5        C.Gayle   40     100  4528000
2020-01-06   6         J.Root   33      72  7028000
2020-01-07   7     K.Peterson   42      85  2528000

[]方法

可以用中括号[]完成对数据框的切片。利用列名对列进行切片,利用列的布尔序列对行进行切片。

# 选取Name列
print(df['Name'])
2020-01-01        M.S.Dhoni
2020-01-02    A.B.D Villers
2020-01-03          V.Kholi
2020-01-04          S.Smith
2020-01-05          C.Gayle
2020-01-06           J.Root
2020-01-07       K.Peterson
Name: Name, dtype: object
# 选取Name和Age列
print(df[['Name','Age']])
                     Name  Age
2020-01-01      M.S.Dhoni   36
2020-01-02  A.B.D Villers   38
2020-01-03        V.Kholi   31
2020-01-04        S.Smith   34
2020-01-05        C.Gayle   40
2020-01-06         J.Root   33
2020-01-07     K.Peterson   42
# 选取Name字段中包含字符o的行
print(df[df['Name'].str.contains('o')])
            Id        Name  Age  Weight   Salary
2020-01-01   1   M.S.Dhoni   36      75  5428000
2020-01-03   3     V.Kholi   31      70  8428000
2020-01-06   6      J.Root   33      72  7028000
2020-01-07   7  K.Peterson   42      85  2528000
# 多条件行切片
print(df[df['Name'].str.contains('o') & df['Age'].map(lambda x: x > 33)])
            Id        Name  Age  Weight   Salary
2020-01-01   1   M.S.Dhoni   36      75  5428000
2020-01-07   7  K.Peterson   42      85  2528000

iloc方法

iloc方法,使用行列的位置对数据框进行切片。支持布尔切片。

行切片

只传入一个参数时,表示对行进行切片。参数为整数返回序列,参数为列表返回数据框。正数表示正向切片,
负数表示反向切片。

# 选取第一行(序列)
print(df.iloc[0])
Id                1
Name      M.S.Dhoni
Age              36
Weight           75
Salary      5428000
Name: 2020-01-01, dtype: object
# 选取第一行(数据框)
print(df.iloc[[0]])
            Id       Name  Age  Weight   Salary
2020-01-01   1  M.S.Dhoni   36      75  5428000
# 选取前2行
print(df.iloc[:2])
            Id           Name  Age  Weight   Salary
2020-01-01   1      M.S.Dhoni   36      75  5428000
2020-01-02   2  A.B.D Villers   38      74  3428000
# 选取第三行到行末
print(df.iloc[2:])
            Id        Name  Age  Weight   Salary
2020-01-03   3     V.Kholi   31      70  8428000
2020-01-04   4     S.Smith   34      80  4428000
2020-01-05   5     C.Gayle   40     100  4528000
2020-01-06   6      J.Root   33      72  7028000
2020-01-07   7  K.Peterson   42      85  2528000
# 选取1,3,5行(设置起止位置和步长)
print(df.iloc[:6:2])
            Id       Name  Age  Weight   Salary
2020-01-01   1  M.S.Dhoni   36      75  5428000
2020-01-03   3    V.Kholi   31      70  8428000
2020-01-05   5    C.Gayle   40     100  4528000
# 选取倒数第2行到行末
print(df.iloc[-2:])
            Id        Name  Age  Weight   Salary
2020-01-06   6      J.Root   33      72  7028000
2020-01-07   7  K.Peterson   42      85  2528000
# 选取4,5,6行(布尔列表切片)
print(df.iloc[[False, False, False, True, True, True, False]])
            Id     Name  Age  Weight   Salary
2020-01-04   4  S.Smith   34      80  4428000
2020-01-05   5  C.Gayle   40     100  4528000
2020-01-06   6   J.Root   33      72  7028000
# 选取Name字段中包含o字符的行
print(df.iloc[df['Name'].str.contains('o').to_list()])
            Id        Name  Age  Weight   Salary
2020-01-01   1   M.S.Dhoni   36      75  5428000
2020-01-03   3     V.Kholi   31      70  8428000
2020-01-06   6      J.Root   33      72  7028000
2020-01-07   7  K.Peterson   42      85  2528000

列切片

使用iloc方法进行列切片时,需要行参数设置为:,表示选取所有的行。列切片方法与行切片相同。

# 选取第一列(序列)
print(df.iloc[:, 0])
2020-01-01    1
2020-01-02    2
2020-01-03    3
2020-01-04    4
2020-01-05    5
2020-01-06    6
2020-01-07    7
Name: Id, dtype: int64
# 选取第一列(数据框)
print(df.iloc[:, [0]])
            Id
2020-01-01   1
2020-01-02   2
2020-01-03   3
2020-01-04   4
2020-01-05   5
2020-01-06   6
2020-01-07   7
# 选取列名中包含a的列
print(df.iloc[:, df.columns.str.contains('a')])
                     Name   Salary
2020-01-01      M.S.Dhoni  5428000
2020-01-02  A.B.D Villers  3428000
2020-01-03        V.Kholi  8428000
2020-01-04        S.Smith  4428000
2020-01-05        C.Gayle  4528000
2020-01-06         J.Root  7028000
2020-01-07     K.Peterson  2528000

组合切片

同时设置行参数与列参数,使用iloc进行组合切片。

# 选取第一行,第一列的元素
print(df.iloc[0, 0])
1
# 选取第1,3行,2,4列
print(df.iloc[[0, 2], [1, 3]])
                 Name  Weight
2020-01-01  M.S.Dhoni      75
2020-01-03    V.Kholi      70
# 选取Name中包含o的行,且列名中包含a的列
print(df.iloc[df['Name'].str.contains('o').to_list(), df.columns.str.contains('a')])
                  Name   Salary
2020-01-01   M.S.Dhoni  5428000
2020-01-03     V.Kholi  8428000
2020-01-06      J.Root  7028000
2020-01-07  K.Peterson  2528000

loc方法

使用loc方法,用行列的名字对数据框进行切片,同时支持布尔索引。

行切片

传入一个参数时,只对行进行切片。

# 选取索引为2020-01-01的行
print(df.loc['2020-01-01'])
Id                1
Name      M.S.Dhoni
Age              36
Weight           75
Salary      5428000
Name: 2020-01-01, dtype: object
# 选取索引为2020-01-01和2020-01-03的行
print(df.loc[['2020-01-01', '2020-01-03']])
            Id       Name  Age  Weight   Salary
2020-01-01   1  M.S.Dhoni   36      75  5428000
2020-01-03   3    V.Kholi   31      70  8428000
# 选取Name字段中包含o的行
print(df.loc[df['Name'].str.contains('o')])
            Id        Name  Age  Weight   Salary
2020-01-01   1   M.S.Dhoni   36      75  5428000
2020-01-03   3     V.Kholi   31      70  8428000
2020-01-06   6      J.Root   33      72  7028000
2020-01-07   7  K.Peterson   42      85  2528000
# 选取索引中包含3或4的行
print(df.loc[df.index.str.contains('3|4')])
            Id     Name  Age  Weight   Salary
2020-01-03   3  V.Kholi   31      70  8428000
2020-01-04   4  S.Smith   34      80  4428000

列切片

使用loc方法进行列切片时,行参数需要设置为:,表示选取所有行。列切片方法与行切片相同。

# 选取Name和Age列
print(df.loc[:, ['Name', 'Age']])
                     Name  Age
2020-01-01      M.S.Dhoni   36
2020-01-02  A.B.D Villers   38
2020-01-03        V.Kholi   31
2020-01-04        S.Smith   34
2020-01-05        C.Gayle   40
2020-01-06         J.Root   33
2020-01-07     K.Peterson   42
# 选取Name列及后面所有的列
print(df.loc[:, 'Name':])
                     Name  Age  Weight   Salary
2020-01-01      M.S.Dhoni   36      75  5428000
2020-01-02  A.B.D Villers   38      74  3428000
2020-01-03        V.Kholi   31      70  8428000
2020-01-04        S.Smith   34      80  4428000
2020-01-05        C.Gayle   40     100  4528000
2020-01-06         J.Root   33      72  7028000
2020-01-07     K.Peterson   42      85  2528000
# 选取包含a字符的所有列
print(df.loc[:, df.columns.str.contains('a')])
                     Name   Salary
2020-01-01      M.S.Dhoni  5428000
2020-01-02  A.B.D Villers  3428000
2020-01-03        V.Kholi  8428000
2020-01-04        S.Smith  4428000
2020-01-05        C.Gayle  4528000
2020-01-06         J.Root  7028000
2020-01-07     K.Peterson  2528000

组合切片

同时设置行参数和列参数,使用loc方法进行组合切片。

# 选取索引为2020-01-01和2020-01-03的行,且列名为Id和Name的列
print(df.loc[['2020-01-01', '2020-01-03'], ['Id', 'Name']])
            Id       Name
2020-01-01   1  M.S.Dhoni
2020-01-03   3    V.Kholi
# 选取Name中包含o的行,且列名中包含a的列
print(df.loc[df['Name'].str.contains('o'), df.columns.str.contains('a')])

                  Name   Salary
2020-01-01   M.S.Dhoni  5428000
2020-01-03     V.Kholi  8428000
2020-01-06      J.Root  7028000
2020-01-07  K.Peterson  2528000
# 根据索引位置与列名切片
print(df.loc[df.index[3:], ['Name', 'Weight']])
                  Name  Weight
2020-01-04     S.Smith      80
2020-01-05     C.Gayle     100
2020-01-06      J.Root      72
2020-01-07  K.Peterson      85
# 根据索引名与列位置切片
print(df.loc[['2020-01-01', '2020-01-03'], df.columns[[2, 4]]])
            Age   Salary
2020-01-01   36  5428000
2020-01-03   31  8428000

filter方法

filter方法与loc方法类似,都是基于索引名和列名进行切片。

# 选取列(默认)
print(df.filter(items=['Name', 'Weight']))
                     Name  Weight
2020-01-01      M.S.Dhoni      75
2020-01-02  A.B.D Villers      74
2020-01-03        V.Kholi      70
2020-01-04        S.Smith      80
2020-01-05        C.Gayle     100
2020-01-06         J.Root      72
2020-01-07     K.Peterson      85
# 选取行
print(df.filter(items=['2020-01-01', '2020-01-03'], axis=0))
            Id       Name  Age  Weight   Salary
2020-01-01   1  M.S.Dhoni   36      75  5428000
2020-01-03   3    V.Kholi   31      70  8428000
# 选取列名包含字符e的列
print(df.filter(like='e'))
                     Name  Age  Weight
2020-01-01      M.S.Dhoni   36      75
2020-01-02  A.B.D Villers   38      74
2020-01-03        V.Kholi   31      70
2020-01-04        S.Smith   34      80
2020-01-05        C.Gayle   40     100
2020-01-06         J.Root   33      72
2020-01-07     K.Peterson   42      85
# 选取列名是字符e结尾的列
print(df.filter(regex='e$'))
                     Name  Age
2020-01-01      M.S.Dhoni   36
2020-01-02  A.B.D Villers   38
2020-01-03        V.Kholi   31
2020-01-04        S.Smith   34
2020-01-05        C.Gayle   40
2020-01-06         J.Root   33
2020-01-07     K.Peterson   42
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容