(后期进行补充)
生成方式及数据结构(简洁版):
详细版(请点击查看)
import pandas as pd
ds = pd.Series([])
df = pd.DataFrame(data=[[22, "北京", "律师" ],
[26, "四川成都", "工程师"],
[24, "江苏南京", "研究员"]],
index=["张某", "李某", "段某"],
columns=["age", "籍贯", "职业"])
运行结果:
张某 22
李某 26
段某 24
Name: ds_name, dtype: int64
age 籍贯 职业
张某 22 北京 律师
李某 26 四川成都 工程师
段某 24 江苏南京 研究员
由此可见:
Series数据结构中有:index , values , name , dtype
DataFrame数据结构中有:df.columns , df.columns.name, df.index, df.index.names, df.values
DataFrame() 数据结构,这里用 df 代表pd.DataFrame(数据) ,如下表:
输入 | 输出 |
---|---|
df.列名 | 取出单列,输出格式为Series |
df[列名] | 取出单列,输出格式为Series |
df[ [列名] ] | 取出单列,输出格式为DataFrame |
df[ [列名1,列名2, 列名3, ……] ] | 取出各个列对应的元素,输出格式为DataFrame |
代码段:
import pandas as pd
df = pd.DataFrame(data=[[22, "北京", "律师" ],
[26, "四川成都", "工程师"],
[24, "江苏南京", "研究员"]],
index=["张某", "李某", "段某"],
columns=["age", "籍贯", "职业"])
df_age = df["age"]
df_age1 = df.age
df_age2 = df[["age"]]
print(df_age, type(df_age))
print(df_age1, type(df_age1))
print(df_age2, type(df_age2))
print(df[["age", "籍贯"]], type(df[["age", "籍贯"]]))
注意:当我们转换成Series结构后,可以通过下标和值均可以相互获取
解释如下:
pd.Series结构:
import pandas as pd
df = pd.DataFrame(data=[[22, "北京", "律师" ],
[26, "四川成都", "工程师"],
[24, "江苏南京", "研究员"]],
index=["张某", "李某", "段某"],
columns=["age", "籍贯", "职业"])
df_age = df["age"]
# 通过下标获得值:
print(df_age[0]) # 也可以是;
print(df_age["张某"])
# 通过值获得下标:(注意下面两者的区别)
print(df_age[df_age.values==22].index)
print(df_age[df_age.values==22].index[0])
运行结果:
22
22
Index(['李某'], dtype='object')
李某
通过切片方式选取多行
import pandas as pd
df = pd.DataFrame(data=[[22, "北京", "律师" ],
[26, "四川成都", "工程师"],
[24, "江苏南京", "研究员"]],
index=["张某", "李某", "段某"],
columns=["age", "籍贯", "职业"])
print(df["张某": "段某": 2])
这里的 2 代表步长,
["张某": "段某": 2] = [下界 : 上界 : 步长]
注意这里使用的是一个中括号。
运行结果:
age 籍贯 职业
Name
张某 22 北京 律师
段某 24 江苏南京 研究员
注意:
df["作为下界的列名": "作为上界的列名" : 步长] ----> 错误错误错误!!!
有一个参数: df.loc[行索引]
df.loc[ [行index] ]
df.loc[ [行index1, 行index2, 行index3 , ……] ]
下面会解释两者的区别,且听我娓娓道来
两个参数: 横纵联合 : df.loc[row横_label, col纵_label]
同样的也有:
df.loc[ [row横_label1, row横_label2, ……], [col纵_label1, col纵_label2, ……]]
注意横向(行索引 index)是必备的。
代码实战:
import pandas as pd
df = pd.DataFrame(data=[[22, "北京", "律师" ],
[26, "四川成都", "工程师"],
[24, "江苏南京", "研究员"],
[11, "山东青岛", "医生"]],
index=pd.Index(["张某", "李某", "段某", "段某"], name="Name"),
columns=["age", "籍贯", "职业"])
print(df.loc["张某"], type(df.loc["张某"])) ## 张某 在data中 只有一个
print()
print(df.loc[["张某"]], type(df.loc[["张某"]]))
print()
print(df.loc["段某"], type(df.loc["段某"])) ## 段某 在data中 有多个
print()
df_s = df.loc["张某"]["age"] # 先执行df.loc["张某"],再从完成的结果中执行["age"]
df_s1 = df.loc["张某", "age"]
print(df_s)
print()
print(df_s1)
# print(df.loc["age"]) (错误代码) #因为这是列名,第一个取值不能是列名
运行结果:
print(df.loc["张某"], type(df.loc["张某"]))
age 22
籍贯 北京
职业 律师
Name: 张某, dtype: object <class 'pandas.core.series.Series'>
print(df.loc[["张某"]], type(df.loc[["张某"]]))
age 籍贯 职业
Name
张某 22 北京 律师 <class 'pandas.core.frame.DataFrame'>
print(df.loc["段某"], type(df.loc["段某"]))
age 籍贯 职业
Name
段某 24 江苏南京 研究员
段某 11 山东青岛 医生 <class 'pandas.core.frame.DataFrame'>
22
22 ##注意这里取出的 22 的程序执行方式不同。
#解释:
df.loc[唯一的行索引] --> 如果行index是唯一的数据,则它的输出结构是Series
df.loc[ [唯一的行索引] ] --> 如果我们想要唯一index,且输出结构为DataFrame框架, 便可以使用这个。
df.loc[ 存在多个行index ] --> 如果这个行index的名称是多个的,则将会是DataFrame
变量名.loc[ [行index1, 行index2, ……] ] 选取多行
df_s_n = df.loc[["张某", "段某"]]
print(df_s_n)
运行结果:
age 籍贯 职业
Name
张某 22 北京 律师
段某 24 江苏南京 研究员
简化记忆:
上面描述的多值选取的情况:
df.loc[ [行index1, 行index2, 行index3 , ……] ]
df.loc[ [row横_label1, row横_label2, ……], [col纵_label1, col纵_label2, ……]]
如果所选参数是唯一值(程序执行过程中不会产生歧义),那么就可以使用切片的方式来表示 一一填写列举的 列表。
意思:(不会产生歧义的情况下)
df.loc[ [行index1, 行index2, 行index3 , ……] ] = df.loc[行index1 : 行index2:步长]
注意,df.loc[] 是固定的,而是使用:
[行index1, 行index2, 行index3 , ……] == [行index1 : 行index2:步长]
代替了列表中一一列举的元素。
总结:用列表生成的方式,代替了一一列举元素的列表
df.loc[ 进行筛选的条件 ] -- 如果条件为真,则选出符合条件的结果。
复合条件: &(且 = 与) , |(或) , ~(取反 = 非)
通过筛选函数进行筛选, 常见的有 isin(), where() 等。
注意(筛选函数 = 限定条件的函数。
这里的筛选函数是瞎编的,具体有哪些我不清楚)
简单实战代码:
import pandas as pd
df = pd.DataFrame(data=[[22, "北京", "律师" ],
[26, "四川成都", "工程师"],
[24, "江苏南京", "研究员"],
[11, "山东青岛", "医生"]],
index=pd.Index(["张某", "李某", "段某", "段某"], name="Name"),
columns=["age", "籍贯", "职业"])
result1 = df.loc[df.index == "张某"]
print(result1) # 等式条件
print("**"*6)
result2 = df["age"].loc[df["age"] > 20]
print(result2) # 不等式条件
print("**"*6)
res = (df.index == "张某") & (df["age"] > 20)
print(df.loc[res]) # 混合条件
运行结果:
age 籍贯 职业
Name
张某 22 北京 律师
************
Name
张某 22
李某 26
段某 24
Name: age, dtype: int64
************
age 籍贯 职业
Name
张某 22 北京 律师
iloc 的使用与 loc 完全类似,只不过是针对**位置( = 第几个 )**进行筛选
.iloc[ 整数、整数列表、整数切片、布尔列表以及函数 ]
解释: [ ]里面的使用方法同.loc[ ] 方法。
这里介绍一下:.iloc[ 函数 ]
函数 = 自定义函数 (函数的返回值需要是合法对象 (= 整数、整数列表、整数切片、布尔列表))
匿名函数 lambda : 使用方法:
lambda x: slice(1, 4)
lambda 自变量: slice(start = 下界, stop = 上界, step = 步长)
代码实战:
res_lambda = df.iloc[lambda x: slice(1, 4)]
print(res_lambda)
运行结果:
age 籍贯 职业
Name
李某 26 四川成都 工程师
段某 24 江苏南京 研究员
段某 11 山东青岛 医生
可以从此处得知:
slice() 是不包含 stop 的
使用方法:
df.query( 字符串形式 )
把字符串形式的查询表达式传入 query 方法来查询数据
常见取值方式:
(请点击查看)
写法 | 功能 |
---|---|
变量名[ index具体内容 ] | index对应的值 |
变量名[ [index1, index2, index3, ……… ] ] | 依次提取对应行的值 |
变量名[ 下限index1 : 上限index2 : 步长] | 在下限的基础上,取出步长的行,并遇到上限就截止 |
以上的index也可以由数字表示。
代码实战:
import pandas as pd
s = pd.Series(data=[1, 2, 3, 4, 5, 6],
index=['a', 'b', 'a', 'a', 'a', 'c'])
print(s["a"])
print("-----------------")
print(s[["b", "c"]])
print("-----------------")
print(s["b": "c"])
print("-----------------")
print(s["b": "c": 2])
print("-----------------")
print(s["b": "c": 18])
运行结果:
a 1
a 3
a 4
a 5
dtype: int64
------------------
b 2
c 6
dtype: int64
-----------------
b 2
a 3
a 4
a 5
c 6
dtype: int64
-----------------
b 2
a 4
c 6
dtype: int64
-----------------
b 2
dtype: int64
下面是通过数值进行取的
import pandas as pd
s = pd.Series(['a', 'b', 'c', 'd', 'e', 'f'], index=[1, 3, 1, 2, 5, 4])
print(s[1])
print("-----------------")
print(s[1: -1: 2])
运行结果:
1 a
1 c
dtype: object
-----------------
3 b
2 d
dtype: object