当前位置:主页 > 查看内容

上手Pandas,带你玩转数据(5)-- 数据转换与数据定位

发布时间:2021-05-18 00:00| 位朋友查看

简介:文章目录 pandas按列选择数据 中括号取值 按照数据类型选择列 filter方法选择列 pandas按行选择数据 行或列智能函数应用程序 大数据排序 sort_index方法 sort_values方法 分组与聚合计算 分组 合并两列数据 去重在上一篇讲过了这里就不再提及。 pandas按列选……

在这里插入图片描述


去重在上一篇讲过了,这里就不再提及。

pandas按列选择数据

中括号取值

就先来个最直观的方式,直接中括号取值。

# 创建含有空格的数据
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

filter方法选择列

它有三个常用参数,我们一个一个看,不过要注意:这三个参数并不能同时出现。


使用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   上海

pandas按行选择数据

先看个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

大数据排序

sort_index方法

这个函数呢,你看到它的参数有很多,但是常用参数只有一个: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   上海

你要问为什么把中文名改成英文名啊,那我哪知道中文是怎么排序的。。。

别问,问就是不知道。


sort_values方法

这个函数就比较,高可拓展。
常用参数我们看看:

by:strlist,按照列名排序
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)

;原文链接:https://blog.csdn.net/qq_43762191/article/details/115502352
本站部分内容转载于网络,版权归原作者所有,转载之目的在于传播更多优秀技术内容,如有侵权请联系QQ/微信:153890879删除,谢谢!
上一篇:自然语言处理-斗罗大陆词切分 下一篇:没有了

推荐图文


随机推荐