2数据分析库pandas的使用

# 导入libraries
import pandas as pd
import numpy as np
# 设置显示选项
# pd.set_option("display.show_dimensions", False)
# pd.set_option("display.float_format", "{:4.2g}".format)

Series和DataFrame提供的有丰富的下标存取方法,可以直接使用[],也可以使用如下形式:

.loc[]和.iloc[]和.at[]和.iat以及.ix[]

下标存取

np.random.seed(42)
df = pd.DataFrame(np.random.randint(0, 10, (5, 3)), 
                  index=["r1", "r2", "r3", "r4", "r5"], 
                  columns=["c1", "c2", "c3"])

[]操作符

print(df)
print("df的类型为;{}".format(type(df)))
print("*"*50)
print(df[2:4])
print("df[2:4]的类型为;{}".format(type(df[2:4])))
print("*"*50)
print(df["r2":"r4"])
print('df["r2":"r4"]的类型为;{}'.format(type(df["r2":"r4"])))
    c1  c2  c3
r1   6   3   7
r2   4   6   9
r3   2   6   7
r4   4   3   7
r5   7   2   5
df的类型为;<class 'pandas.core.frame.DataFrame'>
**************************************************
    c1  c2  c3
r3   2   6   7
r4   4   3   7
df[2:4]的类型为;<class 'pandas.core.frame.DataFrame'>
**************************************************
    c1  c2  c3
r2   4   6   9
r3   2   6   7
r4   4   3   7
df["r2":"r4"]的类型为;<class 'pandas.core.frame.DataFrame'>
# 可以看到,切片操作中使用的“下标”是数字还是索引,,结果不同。在于是否包含后面的下标范围
# df.c1>4结果是一个布尔序列,结果为该序列中值为True所对应的行。
df[df.c1 > 4]
print("df[df.c1>4]的类型:{}".format(type(df[df.c1>4])))
df[df.c1>4]的类型:<class 'pandas.core.frame.DataFrame'>
# 这里的范围是>2,不满足的值,使用NaN填充
df[df > 2]
c1c2c3
r1637
r2469
r3nan67
r4437
r57nan5
df[df >= 2]
c1c2c3
r1637
r2469
r3267
r4437
r5725

.loc[].iloc[]存取器

df.loc["r2"]
# print(type(df.loc["r2"]))
c1    4
c2    6
c3    9
Name: r2, dtype: int32
df.loc["r2","c2"]
# print(type(df.loc["r2","c2"]))
6
df.loc[["r2","r3"]]
c1c2c3
r2469
r3267
df.loc[["r2","r3"],["c1","c2"]]
c1c2
r246
r326
df.loc["r2":"r4", ["c2","c3"]]
c2c3
r269
r367
r437
df.loc[df.c1>2, ["c1","c2"]]
c1c2
r163
r246
r443
r572
# iloc[]与loc[]类似,但不同之处在于:前者使用的是整数下标.
df.iloc[2]
c1    2
c2    6
c3    7
Name: r3, dtype: int32
df.iloc[[2,4]]
c1c2c3
r3267
r5725
df.iloc[[1,3],[0,2]]
c1c3
r249
r447
df.iloc[2:4, [0,2]]
c1c3
r327
r447
df.iloc[df.c1.values>2, [0,1]]
c1c2
r163
r246
r443
r572
# df.ix[2:4, ["c1", "c3"]]  # 使用有警告,推荐使用:.loc[]或者.iloc[]

D:\installation\anaconda3\lib\site-packages\ipykernel_launcher.py:1: FutureWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated
“”"Entry point for launching an IPython kernel.
D:\installation\anaconda3\lib\site-packages\pandas\core\indexing.py:822: FutureWarning:
.ix is deprecated. Please use
.loc for label based indexing or
.iloc for positional indexing

See the documentation here:
http://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#ix-indexer-is-deprecated
retval = getattr(retval, self.name)._getitem_axis(key, axis=i)

# df.ix["r1":"r3", [0, 2]] # 使用有警告,推荐使用.iloc[]或者.loc[]

获取单个值

.at[]和.iat[]分别使用标签和整数下标获取单个值,此外,get_value()和.at[]类似,但其执行速度会更加快。

df
c1c2c3
r1637
r2469
r3267
r4437
r5725
df.at["r2", "c2"]
6
df.iat[1, 1]
6
# df.get_value("r2", "c2")   # 使用有警告,推荐使用.at[]和.iat[]

如若,希望获取两个列表中每一对标签所对应的元素,可以使用.lookup(),结果返回一个指定元素的数组

df.lookup(["r2", "r4", "r3"], ["c1", "c2", "c1"])
array([4, 3, 2])
# 注意这里,不是什么笛卡尔积形式!!!!
# 这里才是从多个集合的笛卡尔积创建MultiIndex对象
midx = pd.MultiIndex.from_product([["A", "B", "C"], ["x", "y"]], 
                           names=["class1", "class2"])
df12 = pd.DataFrame(np.random.randint(0, 10, (6, 6)), columns=midx, index=midx)

df12
class1ABC
class2xyxyxy
class1class2
Ax031731
y559351
Bx919376
y874147
Cx988086
y870772
# 查看类型
print(type(df12))
<class 'pandas.core.frame.DataFrame'>

多级标签的存取

# %pwd
soil_df = pd.read_csv("./data/Soils-simple.csv", index_col=[0, 1], parse_dates=["Date"])
soil_df
pHDensCaConducDateName
DepthContour
0-10Depression5.40.98111.52015-05-26Lois
Slope5.51.11222015-04-30Roy
Top5.31131.42015-05-21Roy
10-30Depression4.91.47.55.52015-03-21Lois
Slope5.31.39.54.92015-02-06Diana
Top4.81.3103.62015-04-11Diana
soil_df.loc["10-30", ["pH", "Ca"]]
pHCa
Contour
Depression4.97.5
Slope5.39.5
Top4.810
# 因为,在python中,只有在[]中才可以直接使用“:”分割的切片语法,这里使用np.s_对象来创建第零轴的下标“:”
soil_df.loc[np.s_[:, "Top"], ["pH", "Ca"]]
pHCa
DepthContour
0-10Top5.313
10-30Top4.810

query()方法

有时候需要根据一定的条件,对行,,进行过滤,通常需要先创建一个布尔数组,使用这个数组获取True值所对应的行。示例如下:

soil_df[(soil_df.PH > 5) & (soil_df.Ca < 11)] 这个是原始形式,

# 使用query()
print(soil_df.query("pH > 5 and Ca < 11"))
                   pH  Dens   Ca  Conduc       Date   Name
Depth Contour                                             
0-10  Depression  5.4  0.98   11     1.5 2015-05-26   Lois
10-30 Slope       5.3   1.3  9.5     4.9 2015-02-06  Diana

query()的参数是一个运算表达式字符串。其中可以使用:not,and,or等关键字进行向量布尔运算,表达式中的变量名代表与其对应的列。这里使用的@符号:是为了使用其他的全局变量或者局域变量的值。

pH_low = 5
Ca_hi = 11
print(soil_df.query("pH > @pH_low and Ca < @Ca_hi"))
                   pH  Dens   Ca  Conduc       Date   Name
Depth Contour                                             
0-10  Depression  5.4  0.98   11     1.5 2015-05-26   Lois
10-30 Slope       5.3   1.3  9.5     4.9 2015-02-06  Diana

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值