Pandas

02. Pandas读取数据

本代码演示:

  1. pandas读取纯文本文件

  • 读取csv文件

  • 读取txt文件

  1. pandas读取xlsx格式excel文件

  2. pandas读取mysql数据表

In [1]:

import pandas as pd

1、读取纯文本文件

import pandas as pd
fpath = "./ratings.csv"
ratings = pd.read_csv(fpath)
print(ratings.head())
print(ratings.shape)
print(ratings.columns)
print(ratings.index)
print(ratings.dtypes)

1.1 读取CSV,使用默认的标题行、逗号分隔符

In [2]:

fpath = "./datas/ml-latest-small/ratings.csv"

In [3]:

# 使用pd.read_csv读取数据
ratings = pd.read_csv(fpath)

In [4]:

# 查看前几行数据
ratings.head()

Out[4]:

userIdmovieIdratingtimestamp
0114.0964982703
1134.0964981247
2164.0964982224
31475.0964983815
41505.0964982931

In [5]:

# 查看数据的形状,返回(行数、列数)
ratings.shape

Out[5]:

(100836, 4)

In [6]:

# 查看列名列表
ratings.columns

Out[6]:

Index(['userId', 'movieId', 'rating', 'timestamp'], dtype='object')

In [7]:

# 查看索引列
ratings.index

Out[7]:

RangeIndex(start=0, stop=100836, step=1)

In [8]:

# 查看每列的数据类型
ratings.dtypes

Out[8]:

userId         int64
movieId        int64
rating       float64
timestamp      int64
dtype: object

1.2 读取txt文件,自己指定分隔符、列名

In [9]:

fpath = "./datas/crazyant/access_pvuv.txt"

In [10]:

pvuv = pd.read_csv(
    fpath,
    sep="\t",
    header=None,
    names=['pdate', 'pv', 'uv']
)

In [11]:

pvuv

Out[11]:

pdatepvuv
02019-09-1013992
12019-09-09185153
22019-09-0812359
32019-09-076540
42019-09-0615798
52019-09-05205151
62019-09-04196167
72019-09-03216176
82019-09-02227148
92019-09-0110561

2、读取excel文件

In [12]:

fpath = "./datas/crazyant/access_pvuv.xlsx"
pvuv = pd.read_excel(fpath)

In [13]:

pvuv

Out[13]:

日期PVUV
02019-09-1013992
12019-09-09185153
22019-09-0812359
32019-09-076540
42019-09-0615798
52019-09-05205151
62019-09-04196167
72019-09-03216176
82019-09-02227148
92019-09-0110561
import pandas as pd
​
fpath = "./access_pvuv.txt"
pvuv= pd.read_csv(
    fpath,
    sep="\t",
    header=None,
    names=['pdate', 'pv', 'uv']
)
print(pvuv)

3、读取MySQL数据库

In [14]:

import pymysql
conn = pymysql.connect(
        host='127.0.0.1',
        user='root',
        password='12345678',
        database='test',
        charset='utf8'
    )

In [15]:

mysql_page = pd.read_sql("select * from crazyant_pvuv", con=conn)

In [16]:

mysql_page

Out[16]:

pdatepvuv
02019-09-1013992
12019-09-09185153
22019-09-0812359
32019-09-076540
42019-09-0615798
52019-09-05205151
62019-09-04196167
72019-09-03216176
82019-09-02227148
92019-09-0110561

In [ ]:

  1. Series

  2. DataFrame

  3. 从DataFrame中查询出Series

In [1]:

import pandas as pd
import numpy as np
import pandas as pd
import pymysql
conn=pymysql.connect(
    host='127.0.0.1',
    user='root',
    password='12345678',
    database='test',
    charset='utf8'
)
mysql_page=pd.read_sql("select * from crazyant_pvuv",con=conn)
print(mysql_page)

1. Series

Series是一种类似于一维数组的对象,它由一组数据(不同数据类型)以及一组与之相关的数据标签(即索引)组成。

1.1 仅有数据列表即可产生最简单的Series

In [2]:

s1 = pd.Series([1,'a',5.2,7])

In [3]:

# 左侧为索引,右侧是数据
s1

Out[3]:

0      1
1      a
2    5.2
3      7
dtype: object

In [4]:

# 获取索引
s1.index

Out[4]:

RangeIndex(start=0, stop=4, step=1)

In [5]:

# 获取数据
s1.values

Out[5]:

array([1, 'a', 5.2, 7], dtype=object)

1.2 创建一个具有标签索引的Series

In [6]:

s2 = pd.Series([1, 'a', 5.2, 7], index=['d','b','a','c'])

In [7]:

s2

Out[7]:

d      1
b      a
a    5.2
c      7
dtype: object

In [8]:

s2.index

Out[8]:

Index(['d', 'b', 'a', 'c'], dtype='object')

1.3 使用Python字典创建Series

In [9]:

sdata={'Ohio':35000,'Texas':72000,'Oregon':16000,'Utah':5000}

In [10]:

s3=pd.Series(sdata)

In [11]:

s3

Out[11]:

Ohio      35000
Texas     72000
Oregon    16000
Utah       5000
dtype: int64

1.4 根据标签索引查询数据

类似Python的字典dict

In [12]:

s2

Out[12]:

d      1
b      a
a    5.2
c      7
dtype: object

In [13]:

s2['a']

Out[13]:

5.2

In [14]:

type(s2['a'])

Out[14]:

float

In [15]:

s2[['b','a']]

Out[15]:

b      a
a    5.2
dtype: object

In [16]:

type(s2[['b','a']])

Out[16]:

pandas.core.series.Series

2. DataFrame

DataFrame是一个表格型的数据结构

  • 每列可以是不同的值类型(数值、字符串、布尔值等)

  • 既有行索引index,也有列索引columns

  • 可以被看做由Series组成的字典

创建dataframe最常用的方法,见02节读取纯文本文件、excel、mysql数据库

2.1 根据多个字典序列创建dataframe

In [17]:

data={
        'state':['Ohio','Ohio','Ohio','Nevada','Nevada'],
        'year':[2000,2001,2002,2001,2002],
        'pop':[1.5,1.7,3.6,2.4,2.9]
    }
df = pd.DataFrame(data)

In [18]:

df

Out[18]:

stateyearpop
0Ohio20001.5
1Ohio20011.7
2Ohio20023.6
3Nevada20012.4
4Nevada20022.9

In [19]:

df.dtypes

Out[19]:

state     object
year       int64
pop      float64
dtype: object

In [20]:

df.columns

Out[20]:

Index(['state', 'year', 'pop'], dtype='object')

In [21]:

df.index

Out[21]:

RangeIndex(start=0, stop=5, step=1)

3. 从DataFrame中查询出Series

  • 如果只查询一行、一列,返回的是pd.Series

  • 如果查询多行、多列,返回的是pd.DataFrame

In [22]:

df

Out[22]:

stateyearpop
0Ohio20001.5
1Ohio20011.7
2Ohio20023.6
3Nevada20012.4
4Nevada20022.9

3.1 查询一列,结果是一个pd.Series

In [23]:

df['year']

Out[23]:

0    2000
1    2001
2    2002
3    2001
4    2002
Name: year, dtype: int64

In [24]:

type(df['year'])

Out[24]:

pandas.core.series.Series

3.2 查询多列,结果是一个pd.DataFrame

In [25]:

df[['year', 'pop']]

Out[25]:

yearpop
020001.5
120011.7
220023.6
320012.4
420022.9

In [26]:

type(df[['year', 'pop']])

Out[26]:

pandas.core.frame.DataFrame

3.3 查询一行,结果是一个pd.Series

In [27]:

df.loc[1]

Out[27]:

state    Ohio
year     2001
pop       1.7
Name: 1, dtype: object

In [28]:

type(df.loc[1])

Out[28]:

pandas.core.series.Series

3.4 查询多行,结果是一个pd.DataFrame

In [29]:

df.loc[1:3]

Out[29]:

stateyearpop
1Ohio20011.7
2Ohio20023.6
3Nevada20012.4

In [30]:

type(df.loc[1:3])

Out[30]:

pandas.core.frame.DataFrame

import pandas as pd
import numpy as np
​
# 创建一个不带标签的 Series
s1 = pd.Series([1, 'a', 5.2, 7])
print(s1) # 输出 s1 的内容
print(s1.index) # 输出 s1 的索引
print(s1.values) # 输出 s1 的值
​
# 通过指定索引标签创建一个 Series
s2 = pd.Series([1, 'a', 5.2, 7], index=['a', 'b', 'c', 'd'])
print(s2.index) # 输出 s2 的索引
print(s2) # 输出 s2 的内容
​
# 使用列表或字典中的数据创建 Series
sdata = {'Ohio': 35000, 'Texas': 72000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)
print(s3) # 输出 s3 的内容
​
# 输出 Series 中的元素及类型信息等
print(s2['a']) # 输出 S2 中 a 对应的元素
print(type(s2['a'])) # 输出 S2 中 a 对应元素的类型
print(s2[['b', 'a']]) # 输出 S2 中 b,a 位置对应的元素
print(type(s2[['a', 'b']])) # 输出 S2 中 b,a 位置对应的元素的类型
​
# 使用嵌套字典来创建 DataFrame
data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]
}
df = pd.DataFrame(data)
print(df.dtypes) # 输出 df 各列的数据类型信息
print(df.columns) # 输出 df 各列名称
print(df.index) # 输出 df 的行索引
print(df) # 输出 df 内容
​
# 获取 DataFrame 的一部分数据
print(df['year']) # 输出 df 数据中“年份”所在的列
print(type(df['year'])) # 输出 df 数据中“年份”列的数据类型
print(df[['year', 'pop']]) # 输出 df 数据中“年份”和“人口”两列的数据
​
# 使用 loc 方法访问 DataFrame 中某一行或若干行
print(df.loc[1]) # 输出 df 中 index 为 1 的那一行
print(type(df.loc[1])) # 输出通过 loc 方法取出的 df 的行的数据类型
print(df.loc[1:3]) # 输出从 1 到 3 行(包括边界)所有数据
print(type(df.loc[1:3])) # 输出通过 loc 方法取出的 df 区域块的数据类型

Pandas查询数据

今天没有漂亮的PPT,只有干货!!

Pandas查询数据的几种方法

  1. df.loc方法,根据行、列的标签值查询

  2. df.iloc方法,根据行、列的数字位置查询

  3. df.where方法

  4. df.query方法

.loc既能查询,又能覆盖写入,强烈推荐!

Pandas使用df.loc查询数据的方法

  1. 使用单个label值查询数据

  2. 使用值列表批量查询

  3. 使用数值区间进行范围查询

  4. 使用条件表达式查询

  5. 调用函数查询

注意

  • 以上查询方法,既适用于行,也适用于列

  • 注意观察降维dataFrame>Series>值

微信公众号:【蚂蚁学Python】,Python原创免费视频分享

In [23]:

import pandas as pd
print(pd.__version__)
1.0.1

0、读取数据

数据为北京2018年全年天气预报 该数据的爬虫教程参见我的Python爬虫系列视频课程

In [2]:

df = pd.read_csv("./datas/beijing_tianqi/beijing_tianqi_2018.csv")

In [3]:

df.head()

Out[3]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
02018-01-013℃-6℃晴~多云东北风1-2级592
12018-01-022℃-5℃阴~多云东北风1-2级491
22018-01-032℃-5℃多云北风1-2级281
32018-01-040℃-8℃东北风1-2级281
42018-01-053℃-6℃多云~晴西北风1-2级501

In [4]:

# 设定索引为日期,方便按日期筛选
df.set_index('ymd', inplace=True)

In [5]:

# 时间序列见后续课程,本次按字符串处理
df.index

Out[5]:

Index(['2018-01-01', '2018-01-02', '2018-01-03', '2018-01-04', '2018-01-05',
       '2018-01-06', '2018-01-07', '2018-01-08', '2018-01-09', '2018-01-10',
       ...
       '2018-12-22', '2018-12-23', '2018-12-24', '2018-12-25', '2018-12-26',
       '2018-12-27', '2018-12-28', '2018-12-29', '2018-12-30', '2018-12-31'],
      dtype='object', name='ymd', length=365)

In [6]:

df.head()

Out[6]:

bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-01-013℃-6℃晴~多云东北风1-2级592
2018-01-022℃-5℃阴~多云东北风1-2级491
2018-01-032℃-5℃多云北风1-2级281
2018-01-040℃-8℃东北风1-2级281
2018-01-053℃-6℃多云~晴西北风1-2级501

In [7]:

# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')

In [8]:

df.dtypes

Out[8]:

bWendu        int32
yWendu        int32
tianqi       object
fengxiang    object
fengli       object
aqi           int64
aqiInfo      object
aqiLevel      int64
dtype: object

In [9]:

df.head()

Out[9]:

bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-01-013-6晴~多云东北风1-2级592
2018-01-022-5阴~多云东北风1-2级491
2018-01-032-5多云北风1-2级281
2018-01-040-8东北风1-2级281
2018-01-053-6多云~晴西北风1-2级501

1、使用单个label值查询数据

行或者列,都可以只传入单个值,实现精确匹配

In [10]:

# 得到单个值
df.loc['2018-01-03', 'bWendu']

Out[10]:

2

In [11]:

# 得到一个Series
df.loc['2018-01-03', ['bWendu', 'yWendu']]

Out[11]:

bWendu     2
yWendu    -5
Name: 2018-01-03, dtype: object

2、使用值列表批量查询

In [12]:

# 得到Series
df.loc[['2018-01-03','2018-01-04','2018-01-05'], 'bWendu']

Out[12]:

ymd
2018-01-03    2
2018-01-04    0
2018-01-05    3
Name: bWendu, dtype: int32

In [13]:

# 得到DataFrame
df.loc[['2018-01-03','2018-01-04','2018-01-05'], ['bWendu', 'yWendu']]

Out[13]:

bWenduyWendu
ymd
2018-01-032-5
2018-01-040-8
2018-01-053-6

3、使用数值区间进行范围查询

注意:区间既包含开始,也包含结束

In [14]:

# 行index按区间
df.loc['2018-01-03':'2018-01-05', 'bWendu']

Out[14]:

ymd
2018-01-03    2
2018-01-04    0
2018-01-05    3
Name: bWendu, dtype: int32

In [15]:

# 列index按区间
df.loc['2018-01-03', 'bWendu':'fengxiang']

Out[15]:

bWendu        2
yWendu       -5
tianqi       多云
fengxiang    北风
Name: 2018-01-03, dtype: object

In [16]:

# 行和列都按区间查询
df.loc['2018-01-03':'2018-01-05', 'bWendu':'fengxiang']

Out[16]:

bWenduyWendutianqifengxiang
ymd
2018-01-032-5多云北风
2018-01-040-8东北风
2018-01-053-6多云~晴西北风

4、使用条件表达式查询

bool列表的长度得等于行数或者列数

简单条件查询,最低温度低于-10度的列表

In [17]:

df.loc[df["yWendu"]<-10, :]

Out[17]:

bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-01-23-4-12西北风3-4级311
2018-01-24-4-11西南风1-2级341
2018-01-25-3-11多云东北风1-2级271
2018-12-26-2-11晴~多云东北风2级261
2018-12-27-5-12多云~晴西北风3级481
2018-12-28-3-11西北风3级401
2018-12-29-3-12西北风2级291
2018-12-30-2-11晴~多云东北风1级311

In [18]:

# 观察一下这里的boolean条件
df["yWendu"]<-10

Out[18]:

ymd
2018-01-01    False
2018-01-02    False
2018-01-03    False
2018-01-04    False
2018-01-05    False
              ...  
2018-12-27     True
2018-12-28     True
2018-12-29     True
2018-12-30     True
2018-12-31    False
Name: yWendu, Length: 365, dtype: bool

复杂条件查询,查一下我心中的完美天气

注意,组合条件用&符号合并,每个条件判断都得带括号

In [19]:

## 查询最高温度小于30度,并且最低温度大于15度,并且是晴天,并且天气为优的数据
df.loc[(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1), :]

Out[19]:

bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-08-243020北风1-2级401
2018-09-072716西北风3-4级221

我哭,北京好天气这么稀少!!

In [20]:

# 再次观察这里的boolean条件
(df["bWendu"]<=30) & (df["yWendu"]>=15) & (df["tianqi"]=='晴') & (df["aqiLevel"]==1)

Out[20]:

ymd
2018-01-01    False
2018-01-02    False
2018-01-03    False
2018-01-04    False
2018-01-05    False
              ...  
2018-12-27    False
2018-12-28    False
2018-12-29    False
2018-12-30    False
2018-12-31    False
Length: 365, dtype: bool

import pandas as pd
​
print(pd.__version__)
df = pd.read_csv("./beijing_tianqi_2018.csv")
print(df.head())
df.set_index('ymd', inplace=True)
print(df.index)
print(df.head())
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype("int32")
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype("int32")
​
​
print(df.dtypes)
print(df.head())
print(df.loc['2018-01-03','bWendu'])
print(df.loc['2018-01-03',['bWendu','yWendu']])
print(df.loc[['2018-01-03','2018-01-04','2018-01-05'],'bWendu'])
print(df.loc[['2018-01-03','2018-01-04','2018-01-05'],['bWendu','yWendu']])
print(df.loc['2018-01-03':'2018-01-05','bWendu'])
print(df.loc['2018-01-03','bWendu':'fengxiang'])
print(df.loc['2018-01-03':'2018-01-05','bWendu':'fengxiang'])
print(df.loc[df['yWendu']<10,:])
print(df['yWendu']<-10)
print(df.loc[(df["bWendu"] <= 30) & (df["yWendu"] >= 15) & (df["tianqi"] == '晴') & (df["aqiLevel"] == 1), :])
print((df['bWendu'] <= 30) & (df['yWendu'] >= 15) & (df["tianqi"] == '晴') & (df['aqiLevel'] == 1))
print(df.loc[lambda df: (df['bWendu'] <= 30) & (df['yWendu'] >= 15), :])
​
def query_my_data(df):
    return df.index.str.startswith('2018-09') & (df['aqiLevel'] == 1)
​
​
print(df.loc[query_my_data, :])
​

5、调用函数查询

In [21]:

# 直接写lambda表达式
df.loc[lambda df : (df["bWendu"]<=30) & (df["yWendu"]>=15), :]

Out[21]:

bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-04-282717西南风3-4级125轻度污染3
2018-04-293016多云南风3-4级193中度污染4
2018-05-042716晴~多云西南风1-2级862
2018-05-092917晴~多云西南风3-4级792
2018-05-102618多云南风3-4级118轻度污染3
...........................
2018-09-152615多云北风3-4级421
2018-09-172717多云~阴北风1-2级371
2018-09-182517阴~多云西南风1-2级501
2018-09-192617多云南风1-2级522
2018-09-202716多云西南风1-2级632

64 rows × 8 columns

In [22]:

# 编写自己的函数,查询9月份,空气质量好的数据
def query_my_data(df):
    return df.index.str.startswith("2018-09") & (df["aqiLevel"]==1)
    
df.loc[query_my_data, :]

Out[22]:

bWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
ymd
2018-09-012719阴~小雨南风1-2级501
2018-09-043118西南风3-4级241
2018-09-053119晴~多云西南风3-4级341
2018-09-062718多云~晴西北风4-5级371
2018-09-072716西北风3-4级221
2018-09-082715多云~晴北风1-2级281
2018-09-152615多云北风3-4级421
2018-09-162514多云~晴北风1-2级291
2018-09-172717多云~阴北风1-2级371
2018-09-182517阴~多云西南风1-2级501
2018-09-212514西北风3-4级501
2018-09-222413西北风3-4级281
2018-09-232312西北风4-5级281
2018-09-242311北风1-2级281
2018-09-252412晴~多云南风1-2级441
2018-09-292211北风3-4级211
2018-09-301913多云西北风4-5级221

Pandas怎样新增数据列?

在进行数据分析时,经常需要按照一定条件创建新的数据列,然后进行进一步分析。

  1. 直接赋值

  2. df.apply方法

  3. df.assign方法

  4. 按条件选择分组分别赋值 微信公众号:蚂蚁学Python

In [1]:

import pandas as pd

0、读取csv数据到dataframe

In [2]:

fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd.read_csv(fpath)

In [3]:

df.head()

Out[3]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
02018-01-013℃-6℃晴~多云东北风1-2级592
12018-01-022℃-5℃阴~多云东北风1-2级491
22018-01-032℃-5℃多云北风1-2级281
32018-01-040℃-8℃东北风1-2级281
42018-01-053℃-6℃多云~晴西北风1-2级501

1、直接赋值的方法

实例:清理温度列,变成数字类型

In [4]:

# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')

In [6]:

df.head()

Out[6]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
02018-01-013-6晴~多云东北风1-2级592
12018-01-022-5阴~多云东北风1-2级491
22018-01-032-5多云北风1-2级281
32018-01-040-8东北风1-2级281
42018-01-053-6多云~晴西北风1-2级501

实例:计算温差

In [9]:

# 注意,df["bWendu"]其实是一个Series,后面的减法返回的是Series
df.loc[:, "wencha"] = df["bWendu"] - df["yWendu"]

In [10]:

df.head()

Out[10]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevelwencha
02018-01-013-6晴~多云东北风1-2级5929
12018-01-022-5阴~多云东北风1-2级4917
22018-01-032-5多云北风1-2级2817
32018-01-040-8东北风1-2级2818
42018-01-053-6多云~晴西北风1-2级5019

2、df.apply方法

Apply a function along an axis of the DataFrame.

Objects passed to the function are Series objects whose index is either the DataFrame’s index (axis=0) or the DataFrame’s columns (axis=1).

实例:添加一列温度类型:

  1. 如果最高温度大于33度就是高温

  2. 低于-10度是低温

  3. 否则是常温

In [11]:

def get_wendu_type(x):
    if x["bWendu"] > 33:
        return '高温'
    if x["yWendu"] < -10:
        return '低温'
    return '常温'
​
# 注意需要设置axis==1,这是series的index是columns
df.loc[:, "wendu_type"] = df.apply(get_wendu_type, axis=1)

In [12]:

# 查看温度类型的计数
df["wendu_type"].value_counts()

Out[12]:

常温    328
高温     29
低温      8
Name: wendu_type, dtype: int64

3、df.assign方法

Assign new columns to a DataFrame.

Returns a new object with all original columns in addition to new ones.

实例:将温度从摄氏度变成华氏度

In [13]:

# 可以同时添加多个新的列
df.assign(
    yWendu_huashi = lambda x : x["yWendu"] * 9 / 5 + 32,
    # 摄氏度转华氏度
    bWendu_huashi = lambda x : x["bWendu"] * 9 / 5 + 32
)

Out[13]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevelwenchawendu_typeyWendu_huashibWendu_huashi
02018-01-013-6晴~多云东北风1-2级5929常温21.237.4
12018-01-022-5阴~多云东北风1-2级4917常温23.035.6
22018-01-032-5多云北风1-2级2817常温23.035.6
32018-01-040-8东北风1-2级2818常温17.632.0
42018-01-053-6多云~晴西北风1-2级5019常温21.237.4
..........................................
3602018-12-27-5-12多云~晴西北风3级4817低温10.423.0
3612018-12-28-3-11西北风3级4018低温12.226.6
3622018-12-29-3-12西北风2级2919低温10.426.6
3632018-12-30-2-11晴~多云东北风1级3119低温12.228.4
3642018-12-31-2-10多云东北风1级5628常温14.028.4

365 rows × 13 columns

4、按条件选择分组分别赋值

按条件先选择数据,然后对这部分数据赋值新列 实例:高低温差大于10度,则认为温差大

In [14]:

# 先创建空列(这是第一种创建新列的方法)
df['wencha_type'] = ''
​
df.loc[df["bWendu"]-df["yWendu"]>10, "wencha_type"] = "温差大"
​
df.loc[df["bWendu"]-df["yWendu"]<=10, "wencha_type"] = "温差正常"

In [15]:

df["wencha_type"].value_counts()

Out[15]:

温差正常    187
温差大     178
Name: wencha_type, dtype: int64
import pandas as pd
​
df = pd.read_csv("./beijing_tianqi_2018.csv")
print(df.head())
df.loc[:, 'bWendu'] = df['bWendu'].str.replace('℃', '').astype('int32')
df.loc[:, 'yWendu'] = df['yWendu'].str.replace('℃', '').astype('int32')
print(df.head())
df.loc[:, 'wendu'] = df['bWendu'] - df['yWendu']
print(df.head())
​
​
def get_wendu_type(x):
    if x['bWendu'] > 33:
        return '高温'
    if x['yWendu'] < -10:
        return '低温'
    return '常温'
​
​
df.loc[:, 'wendu_type'] = df.apply(get_wendu_type, axis=1)
print(df['wendu_type'].value_counts())
​
df.assign(
    yWendu_huashi=lambda x: x['yWendu'] * 9 / 5 + 32,
    bWendu_huashi=lambda x: x['bWendu'] * 9 / 5 + 32
)
print(df.assign())
​
df['wendu_type']=''
df.loc[df['bWendu']-df['yWendu']>10,'wencha_type']='温差很大'
df.loc[df['bWendu']-df['yWendu']<=10,'wencha_type']='温差正常'
print(df['wencha_type'].value_counts())

Pandas数据排序

Series的排序: Series.sort_values(ascending=True, inplace=False) 参数说明:

  • ascending:默认为True升序排序,为False降序排序

  • inplace:是否修改原始Series

DataFrame的排序: DataFrame.sort_values(by, ascending=True, inplace=False) 参数说明:

  • by:字符串或者List<字符串>,单列排序或者多列排序

  • ascending:bool或者List,升序还是降序,如果是list对应by的多列

  • inplace:是否修改原始DataFrame

In [2]:

import pandas as pd

0、读取数据

In [3]:

fpath = "./datas/beijing_tianqi/beijing_tianqi_2018.csv"
df = pd.read_csv(fpath)
​
# 替换掉温度的后缀℃
df.loc[:, "bWendu"] = df["bWendu"].str.replace("℃", "").astype('int32')
df.loc[:, "yWendu"] = df["yWendu"].str.replace("℃", "").astype('int32')

In [4]:

df.head()

Out[4]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
02018-01-013-6晴~多云东北风1-2级592
12018-01-022-5阴~多云东北风1-2级491
22018-01-032-5多云北风1-2级281
32018-01-040-8东北风1-2级281
42018-01-053-6多云~晴西北风1-2级501

1、Series的排序

In [5]:

df["aqi"].sort_values()

Out[5]:

271     21
281     21
249     22
272     22
301     22
      ... 
317    266
71     287
91     287
72     293
86     387
Name: aqi, Length: 365, dtype: int64

In [6]:

df["aqi"].sort_values(ascending=False)

Out[6]:

86     387
72     293
91     287
71     287
317    266
      ... 
301     22
272     22
249     22
281     21
271     21
Name: aqi, Length: 365, dtype: int64

In [8]:

df["tianqi"].sort_values()

Out[8]:

225     中雨~小雨
230     中雨~小雨
197    中雨~雷阵雨
196    中雨~雷阵雨
112        多云
        ...  
191    雷阵雨~大雨
219     雷阵雨~阴
335      雾~多云
353         霾
348         霾
Name: tianqi, Length: 365, dtype: object

2、DataFrame的排序

2.1 单列排序

In [9]:

df.sort_values(by="aqi")

Out[9]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
2712018-09-292211北风3-4级211
2812018-10-09154多云~晴西北风4-5级211
2492018-09-072716西北风3-4级221
2722018-09-301913多云西北风4-5级221
3012018-10-29153北风3-4级221
..............................
3172018-11-14135多云南风1-2级266重度污染5
712018-03-13175晴~多云南风1-2级287重度污染5
912018-04-022611多云北风1-2级287重度污染5
722018-03-14156多云~阴东北风1-2级293重度污染5
862018-03-28259多云~晴东风1-2级387严重污染6

365 rows × 9 columns

In [10]:

df.sort_values(by="aqi", ascending=False)

Out[10]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
862018-03-28259多云~晴东风1-2级387严重污染6
722018-03-14156多云~阴东北风1-2级293重度污染5
712018-03-13175晴~多云南风1-2级287重度污染5
912018-04-022611多云北风1-2级287重度污染5
3172018-11-14135多云南风1-2级266重度污染5
..............................
2492018-09-072716西北风3-4级221
3012018-10-29153北风3-4级221
2722018-09-301913多云西北风4-5级221
2712018-09-292211北风3-4级211
2812018-10-09154多云~晴西北风4-5级211

365 rows × 9 columns

2.2 多列排序

In [11]:

# 按空气质量等级、最高温度排序,默认升序
df.sort_values(by=["aqiLevel", "bWendu"])

Out[11]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
3602018-12-27-5-12多云~晴西北风3级481
222018-01-23-4-12西北风3-4级311
232018-01-24-4-11西南风1-2级341
3402018-12-07-4-10西北风3级331
212018-01-22-3-10小雪~多云东风1-2级471
..............................
712018-03-13175晴~多云南风1-2级287重度污染5
902018-04-012511晴~多云南风1-2级218重度污染5
912018-04-022611多云北风1-2级287重度污染5
852018-03-272711南风1-2级243重度污染5
862018-03-28259多云~晴东风1-2级387严重污染6

365 rows × 9 columns

In [12]:

# 两个字段都是降序
df.sort_values(by=["aqiLevel", "bWendu"], ascending=False)

Out[12]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
862018-03-28259多云~晴东风1-2级387严重污染6
852018-03-272711南风1-2级243重度污染5
912018-04-022611多云北风1-2级287重度污染5
902018-04-012511晴~多云南风1-2级218重度污染5
712018-03-13175晴~多云南风1-2级287重度污染5
..............................
3622018-12-29-3-12西北风2级291
222018-01-23-4-12西北风3-4级311
232018-01-24-4-11西南风1-2级341
3402018-12-07-4-10西北风3级331
3602018-12-27-5-12多云~晴西北风3级481

365 rows × 9 columns

In [13]:

# 分别指定升序和降序
df.sort_values(by=["aqiLevel", "bWendu"], ascending=[True, False])

Out[13]:

ymdbWenduyWendutianqifengxiangfengliaqiaqiInfoaqiLevel
1782018-06-283524多云~晴北风1-2级331
1492018-05-303318西风1-2级461
2062018-07-263325多云~雷阵雨东北风1-2级401
1582018-06-083219多云~雷阵雨西南风1-2级431
2052018-07-253225多云北风1-2级281
..............................
3172018-11-14135多云南风1-2级266重度污染5
3292018-11-26100多云东南风1级245重度污染5
3352018-12-0292雾~多云东北风1级234重度污染5
572018-02-2770东风1-2级220重度污染5
862018-03-28259多云~晴东风1-2级387严重污染6

365 rows × 9 columns

import pandas as pd
df=pd.read_csv('./beijing_tianqi_2018.csv')
​
df.loc[:,'bWendu']=df['bWendu'].str.replace('℃','').astype('int32')
df.loc[:,'yWendu']=df['yWendu'].str.replace('℃','').astype('int32')
print(df.head())
print(df['aqi'].sort_values())
print(df['aqi'].sort_values(ascending=False))
print(df['tianqi'].sort_values())
print(df.sort_values(by='aqi'))
print(df.sort_values(by='aqi',ascending=False))
print(df.sort_values(by=['aqiLevel','bWendu']))
print(df.sort_values(by=['aqiLevel','bWendu'],ascending=False))
print(df.sort_values(by=['aqiLevel','bWendu'],ascending=[True,False]))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值