去重在上一篇讲过了,这里就不再提及。
就先来个最直观的方式,直接中括号取值。
# 创建含有空格的数据
dict1 = {"name": ["小红", "小明", "小张"], "age": [16, 17, 18], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
print(df2['name'])
0 小红
1 小明
2 小张
Name: name, dtype: object
当然,你要是不知道列名称那怎么行?连列名都不知道还取个球。。。
print(df2.columns)
酱紫
Index(['name', 'age', 'city'], dtype='object')
一般都要选择多列数据的,对吧,对吧!
行,我们来选取一下多列数据:
print(df2[['name','age']]) # 看清楚,传进去的是一个列表,而不是两个字符串咯。
name age
0 小红 16
1 小明 17
2 小张 18
先来获取一下当前DataFrame的数据列数据类型情况吧:
name object
age int64
city object
dtype: object
获取一下object对象呗:
print(df2.select_dtypes(include='object'))
name city
0 小红 北京
1 小明 杭州
2 小张 上海
那,如果说我要选择‘object’对象以外的对象呢?
print(df2.select_dtypes(exclude='object'))
age
0 16
1 17
2 18
它有三个常用参数,我们一个一个看,不过要注意:这三个参数并不能同时出现。
使用items选择多个列:
df2 = df2.filter(items=['name','age'])
print(df2)
就跟上面那个直接取值的是一样的。
name age
0 小红 16
1 小明 17
2 小张 18
使用like选择匹配的列:要求列名中含有。。。
df2 = df2.filter(like='a')
print(df2)
name age
0 小红 16
1 小明 17
2 小张 18
使用正则表达式取列:
df2 = df2.filter(regex='[a-z]')
print(df2)
name age city
0 小红 16 北京
1 小明 17 杭州
2 小张 18 上海
先看个loc方法啊:
df2 = df2.loc[0:2]
print(df2)
name age city
0 小红 16 北京
1 小明 17 杭州
2 小张 18 上海
你悟到了?
再来:
df2 = df2.loc[0:2,['name','age']]
name age
0 小红 16
1 小明 17
2 小张 18
我就把结果放这儿,我就默默不说话。
df2 = df2.loc[(df2['age']>16) & (df2['age']<18)]
df2 = df2.loc[(df2['age']>16) | (df2['age']<18)]
这里我连结果都不想放了,发挥你们的想象力。
差不多了吧,我想想还有啥、、
lambda表达式,对、
df2 = df2.loc[lambda x:x.city == '北京']
呐,像这样。
可以使用 apply() 方法沿着DataFrame或Panel的坐标轴应用任意函数,该方法与描述性统计方法一样,采用可选的轴参数。默认情况下,该操作执行列,每列作为一个数组。
pandas 的 apply() 函数可以作用于 Series 或者整个 DataFrame,功能也是自动遍历整个 Series 或者 DataFrame, 对每一个元素运行指定的函数。
举一个例子,现在有这样一组数据,学生的考试成绩:
Name Nationality Score
张 汉 400
李 回 450
王 汉 460
如果民族不是汉族,则总分在考试分数上再加 5 分,现在需要用 pandas 来做这种计算,我们在 Dataframe 中增加一列。
import pandas as pd
df = pd.read_csv("studuent-score.csv")
df['ExtraScore'] = df['Nationality'].apply(lambda x : 5 if x != '汉' else 0)
df['TotalScore'] = df['Score'] + df['ExtraScore']
Name Nationality Score ExtraScore TotalScore
0 张 汉 400 0 400
1 李 回 450 5 455
2 王 汉 460 0 460
DataFrame.apply() 函数则会遍历每一个元素,对元素运行指定的 function。
matrix = [
[1,2,3],
[4,5,6],
[7,8,9]
]
df = pd.DataFrame(matrix, columns=list('xyz'), index=list('abc'))
df.apply(np.square)
对 df 执行 square() 函数后,所有的元素都执行平方运算:
x y z
a 1 4 9
b 16 25 36
c 49 64 81
如果只想 apply() 作用于指定的行和列,可以用行或者列的 name 属性进行限定。比如下面的示例将 x 列进行平方运算:
df.apply(lambda x : np.square(x) if x.name=='x' else x)
x y z
a 1 2 3
b 16 5 6
c 49 8 9
这个函数呢,你看到它的参数有很多,但是常用参数只有一个:ascending:True升序,False降序。
dict1 = {"name": ["小红", "小明", "小张"], "age": [16, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2 = df2.set_index('age')
df2 = df2.sort_index(ascending=True)
print(df2)
这个是正常可以用的啊,根据索引列进行升序排序。
name city
age
16 小红 北京
17 小张 上海
18 小明 杭州
如果我们的索引列中有重复值,会怎么样?试试看呗:
dict1 = {"name": ["小明", "小张","小红"], "age": [17, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2 = df2.set_index('age')
df2 = df2.sort_index(ascending=True)
print(df2)
看一下结果啊:
name city
age
17 小明 北京
17 小红 上海
18 小张 杭州
可以看出来,当索引列有重复值的时候,就按照在原数据中的顺序进行排放。
那,如果索引列不是阿拉伯数字,而是字符串呢?
啊,不知道各位有没有听说过ASCII码啊,应该都听过吧。
dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2 = df2.set_index('name')
df2 = df2.sort_index(ascending=True)
print(df2)
age city
name
hong 18 杭州
ming 17 北京
zhang 17 上海
你要问为什么把中文名改成英文名啊,那我哪知道中文是怎么排序的。。。
别问,问就是不知道。
这个函数就比较,高可拓展。
常用参数我们看看:
by:str 或 list,按照列名排序
ascending:都懂、
inplace:替换DataFrame的数据
kind:排序算法,快排、归并、堆排,缺省是快排。{'quicksort','mergesort','heapsort'}
按照年龄进行逆向排序
# 创建含有空格的数据
dict1 = {"name": ["ming","hong","zhang"], "age": [17, 18, 17], "city": ["北京 ", "杭州", " 上海 "]}
df2 = pd.DataFrame(dict1, columns=["name", "age", "city"])
# 清除空格
df2["city"] = df2["city"].map(str.strip)
df2.sort_values('age',ascending=False,inplace = True)
print(df2)
age city
name
hong 18 杭州
ming 17 北京
zhang 17 上海
按照年龄和名字进行逆向排序呢?以年龄为主导,姓名为辅助:
df2.sort_values(['age','name'],ascending=False,,inplace = True)
age city
name
hong 18 杭州
zhang 17 上海
ming 17 北京
然后让我们先把数据读出来:
df1 = pd.read_csv('flights.csv')
df2 = pd.read_csv('airlines.csv') #早晚要读,那就一并读了吧
接下来,选取航班有延误的:
df1.loc[df1.ARR_DELAY>=0]
再通过航空公司进行分组:
df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE')
对每个航空公司的航班延误次数进行统计:
df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()
之后再对统计出的数据进行一次排序,并将最终结果赋值给一个变量:
df_delat = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count().sort_values(ascending=False)
AIRLINE
WN 3694
DL 3468
AA 3418
UA 3176
OO 2863
EV 2472
MQ 1367
NK 820
F9 643
US 638
VX 423
AS 262
B6 250
HA 57
Name: AIRLINE, dtype: int64
最终呈现出结果如上。
这里可真的是,卡了我十分钟,也不知道是我读书不认真还是怎么肥四。。。
前面不是读了个航空公司信息嘛,我们刚刚不也得到了延误航班的基础数据嘛,但是那些航空公司代码,你看得懂?
反正我是看不懂。这时候就需要将两组数据进行一个合并:
刚开始我是写这样的:
import pandas as pd
import numpy as np
df1 = pd.read_csv('flights.csv')
df_delay = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()
print(df_delay)
df2 = pd.read_csv('airlines.csv')
df2.set_index('IATA_CODE')
df2['delayed'] = df_delay
print(df2)
结果发现插入的列全是NaN。
于是我就想啊,是不是不能这样简单粗暴?于是我就换了一套方法:index。
就把赋值那一行代码改成这样了:
df2.insert(len(df2.columns),'delayed',df_delay)
好,运行,依旧不得行。
于是我怒了,我打开百度:
跟我说,是因为索引对不上。于是我把建立索引那一行去掉了,结果依旧是不行的。
直到后来,我看到了两个土办法:
import pandas as pd
import numpy as np
df1 = pd.read_csv('flights.csv')
df_delay = df1.loc[df1.ARR_DELAY>=0].groupby('AIRLINE').AIRLINE.count()
print(df_delay)
df2 = pd.read_csv('airlines.csv')
#df2.set_index('IATA_CODE')
df2['delayed'] = list(df_delay) #解决方案一
df2['delayed'] = df_delay.values #解决方案二
#df2.insert(len(df2.columns),'delayed',df_delay)
print(df2)
家里有吃灰老爷机的朋友注意了,谷歌提醒,Chrome浏览器即将放弃对部分平台的支...
前言 说到 Android 启动优化你一般会想到什么呢 Android 多线程异步加载 Android...
中间件及单体架构 消息中间件 在实际的项目中大部分的企业项目开发中在早期都采...
五、XML带来的好处 (1)更有意义的搜索 数据可被XML唯一的标识。没有XML,搜索...
在 MySQL 中设计表的时候,MySQL 官方推荐不要使用 uuid 或者不连续不重复的雪花...
免费CDN网站 CDN也称内容分发网络其原理大概是将服务内容分发至全网加速节点让用...
歌词编辑器 歌词编辑器 第一步:选择要播放的歌曲并播放 第二步:填写全部的歌词...
BP神经网络算法python 底层 TOC 大家好我是朱比特 本节 主要讲解的是BP神经网络...
记得两三年前,当人们在谈论起分布式数据库等技术时,还经常在用未来等词语描述...
MySQL的binlog相信大家都有所耳闻,但是可能没有真正日常使用过。 因此,本文结...