pandas的简单使用(查询)
- head() 和 tail() 函数
- loc 函数
* - 双索引的loc使用
- 使用演示
- iloc 函数
- 条件查询
* - 简单逻辑查询
- 模糊查询
– - 不常用的骚操作
- 关联查询 Merge
* - merge的语法
- merge 数量的对齐关系
– - 理解left join、right join、inner join、outer join的区别
– - 非Key的字段重名
pandas用户指南:https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html
df['列名'] 与 df.列名
输出结果是一致的。哪怕列名是中文也可以
但两个都只能输出一列,如果要输出多列 df[['列1','列2','列3']]
head() 和 tail() 函数
df.head()
df.head(100)
df.tail()
df.tail(100)
loc 函数
语法是df.loc[行名,列名]。有的时候会省略loc,直接这么写df[行名,列名]
df.loc[3,:]
df.loc['索引1', '列3']
df.loc[['索引1','索引2'], ['列1','列2','列3']]
df.loc['索引1':'索引n', '列1':'列n']]
df.loc[['索引1', '索引2', '索引3', '索引4']]
df.loc[:,['列1','列2','列3']]
df[['列1','列2','列3']]
双索引的loc使用
import pandas as pd
df = pd.read_excel('F:\Temp\datas\stocks\互联网公司股票.xlsx')
'''
print(df.index)
RangeIndex(start=0, stop=12, step=1)
'''
df.set_index(['公司', '日期'], inplace=True)
df修改索引前df修改索引后df的索引(双索引是元组形式的)
- 元组(key1,key2)代表筛选多层索引,其中key1是索引第一级,key2是第二级,比如key1=JD, key2=2019-10-02
- 列表[key1,key2]代表同一层的多个KEY,其中key1和key2是并列的同级索引,比如key1=JD, key2=BIDU
使用演示
; iloc 函数
语法是df.iloc[行号,列号]。 无论行列,都是从0开始数
df.iloc[3,:]
df.iloc[2,6]
df.iloc[3:]
df.iloc[0:10]
df.iloc[::-1]
df.iloc[5, 3:]
df.iloc[:, :5]
df.iloc[2:8, 1:4]
df.iloc[::-1].loc[:,['学会','姓名','年龄']]
df[::-1][['学会','姓名','年龄']]
条件查询
xxx = df[(条件1) & (条件2) & (条件3)]
xxx = df.loc[(条件1) | (条件2) | (条件3)]
xxx = df.loc[(条件1) | (条件2) | (条件3),:]
xxx = df[条件].iloc[:,列范围]
xxx = df.loc[(条件), ['列1','列2']]
xxx = df.loc[ 条件 ].iloc[:,列范围]
对于下面的那些代码。loc都是可省略的,还有条件后面的逗号和冒号
简单逻辑查询
df[(df['MonthlyIncome']<6000) & (df['age']<30)]
df.loc[df['MonthlyIncome']==3000,:]
df.loc[(df['MonthlyIncome']10000) & (df['MonthlyIncome']>=3000),:]
df[df['MonthlyIncome'].between(3000,10000)]
df.query("MonthlyIncome=)
df.loc[df['MonthlyIncome'].isin([3000,5000,7000,9000]),:]
df[~df['MonthlyIncome'].isin([3000,5000,7000,9000])]
df[pd.isnull(df['部门'])]
df[df['部门'].isnull()]
df[df['部门'].isna()]
df[df["部门"].notna()]
df[df.isnull().T.any()]
df[pd.isnull(df).T.any()]
df[df.notnull().T.all()]
df[pd.notnull(df).T.all()]
模糊查询
startswith() 按开头字符串进行查找
df.loc[df.名字.str.startswith('张')]
df.loc[df.school.str.startswith('四川')]
endswith() 按结尾字符串进行查找
df.loc[df.名字.str.endswith('博')]
df.loc[df.school.str.endswith('校区')]
contains() 模糊查询
df.query('名字.str.contains("熊")',engine='python')
df.loc[df.名字.str.contains('熊')]
df.loc[df.school.str.contains('实验')]
df.loc[df['school'].str.contains('实验')]
对于正则表达式的查询,写了几个语法,但跟预想的效果完全不一样
df.loc[df.school.str.contains(‘北京’ and ‘大学’)]
df.loc[df.school.str.contains(‘北京’ or ‘大学’)]
df.loc[df.school.str.contains(‘北京&大学’)]
df.loc[df.school.str.contains(‘北京|大学’)]
不常用的骚操作
import numpy as np
df.loc[np.char.find(df['school'].values.astype(str), '实验')>-1]
df.loc[['实验' in x for x in df['场景名称']]]
关联查询 Merge
此部分资料来源于B站up主:https://www.bilibili.com/video/BV1UJ411A7Fs?p=13
Merge官网:https://pandas.pydata.org/pandas-docs/stable/user_guide/10min.html#merge
Pandas的Merge,相当于SQL的join,将不同的表按key关联到一个表
merge的语法
pd.merge(left='left_df', right='right_df', how='inner', on=None, left_on=None, right_on=None, left_index=False, right_index=False, sort=True, suffixes=('_x','_y'), copy=True, indicator=False, validate=None)
- left,right:要merge的DataFrame或者有name的Serier
- how:join类型, “left”,”right”,”outer”,”inner”
- on:join的key,left和right都有需要有这个key
- left_on:left的DataFrame或者Serier的key
- right_on:right的DataFrame或者Serier的key
- left_index,right_index:使用index而不是普通的column做join
- suffixes:两个元素的后缀,如果列有重名,自动添加后缀,默认是(‘_x’,’_y’)
import pandas as pd
pd.set_option('display.max_rows', 80)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 1000)
ratings = pd.read_csv('F:\\data\\ratings.dat', sep='::', engine='python', names=['UserID','MovieId','Rating','Times'])
users = pd.read_csv('F:\\data\\users.dat', sep='::', engine='python', names=['UserID','Gendes','Age','Occupation','Zip-code'])
movies = pd.read_csv('F:\\data\\movies.dat', sep='::', engine='python', names=['MovieId','Title','Gendes'])
df_ratings_users = pd.merge(ratings, users, left_on='UserID', right_on='UserID', how='inner')
ratings_users = pd.merge(ratings, users, left_on='UserID', right_on='UserID', how='inner')
df_ratings_users_movies = pd.merge(ratings_users, movies, left_on='MovieId', right_on='MovieId', how='inner')
merge 数量的对齐关系
一对一
- one-to-one: 一对一关系,关联的key都是唯一
比如 (学号,姓名) merge(学号,年龄)
结果条数为:1*1
import pandas as pd
left = pd.DataFrame({'sno': [11, 12, 13, 14],
'name': ['name_a', 'name_b', 'name_c', 'name_d']
})
right = pd.DataFrame({'sno': [11, 12, 13, 14],
'age': ['21', '22', '23', '24']
})
print(pd.merge(left, right, on='sno'))
'''
sno name age
0 11 name_a 21
1 12 name_b 22
2 13 name_c 23
3 14 name_d 24
'''
一对多
- one-to-many: 一对多关系,左边唯一key,右边不唯一key
比如 (学号,姓名) merge(学号,[语文成绩、数学成绩、英语成绩])
结果条数为:1*N
import pandas as pd
left = pd.DataFrame({'sno': [11, 12, 13, 14],
'name': ['name_a', 'name_b', 'name_c', 'name_d']
})
right = pd.DataFrame({'sno': [11, 11, 11, 12, 12, 13],
'grade': ['语文88', '数学90', '英语75','语文66', '数学55', '英语29']
})
print(pd.merge(left, right, on='sno'))
'''
sno name grade
0 11 name_a 语文88
1 11 name_a 数学90
2 11 name_a 英语75
3 12 name_b 语文66
4 12 name_b 数学55
5 13 name_c 英语29
'''
多对多
- many-to-many: 多对多关系,左边右边都不是唯一的
比如(学号,[语文成绩、数学成绩、英语成绩]) merge (学号,[篮球、足球、乒乓球])
结果条数为:M*N
import pandas as pd
left = pd.DataFrame({'sno': [11, 11, 12, 12,12],
'爱好': ['篮球', '羽毛球', '乒乓球', '篮球', "足球"]
})
right = pd.DataFrame({'sno': [11, 11, 11, 12, 12, 13],
'grade': ['语文88', '数学90', '英语75','语文66', '数学55', '英语29']
})
print(pd.merge(left, right, on='sno'))
'''
sno 爱好 grade
0 11 篮球 语文88
1 11 篮球 数学90
2 11 篮球 英语75
3 11 羽毛球 语文88
4 11 羽毛球 数学90
5 11 羽毛球 英语75
6 12 乒乓球 语文66
7 12 乒乓球 数学55
8 12 篮球 语文66
9 12 篮球 数学55
10 12 足球 语文66
11 12 足球 数学55
'''
理解left join、right join、inner join、outer join的区别
import pandas as pd
left_df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right_df = pd.DataFrame({'key': ['K0', 'K1', 'K4', 'K5'],
'C': ['C0', 'C1', 'C4', 'C5'],
'D': ['D0', 'D1', 'D4', 'D5']})
inner join 默认
左边和右边的key都有,才会出现在结果里
df = pd.merge(left_df, right_df, how='inner')
print(df)
'''
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
'''
left join
左边的都会出现在结果里,右边的如果无法匹配则为Null
df = pd.merge(left_df, right_df, how='left')
print(df)
'''
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 NaN NaN
3 K3 A3 B3 NaN NaN
'''
right join
右边的都会出现在结果里,左边的如果无法匹配则为Null
df = pd.merge(left_df, right_df, how='right')
print(df)
'''
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K4 NaN NaN C4 D4
3 K5 NaN NaN C5 D5
'''
outer join
左边、右边的都会出现在结果里,如果无法匹配则为Null
key A B C D
0 K0 A0 B0 C0 D0
1 K1 A1 B1 C1 D1
2 K2 A2 B2 NaN NaN
3 K3 A3 B3 NaN NaN
4 K4 NaN NaN C4 D4
5 K5 NaN NaN C5 D5
非Key的字段重名
import pandas as pd
left_df = pd.DataFrame({'key': ['K0', 'K1', 'K2', 'K3'],
'A': ['A0', 'A1', 'A2', 'A3'],
'B': ['B0', 'B1', 'B2', 'B3']})
right_df = pd.DataFrame({'key': ['K0', 'K1', 'K4', 'K5'],
'A': ['A10', 'A11', 'A12', 'A13'],
'D': ['D0', 'D1', 'D4', 'D5']})
默认情况
df = pd.merge(left_df, right_df, on='key')
print(df)
'''
key A_x B A_y D
0 K0 A0 B0 A10 D0
1 K1 A1 B1 A11 D1
'''
自己添加后缀
df = pd.merge(left_df, right_df, on='key', suffixes=('_left', '_right'))
print(df)
'''
key A_left B A_right D
0 K0 A0 B0 A10 D0
1 K1 A1 B1 A11 D1
'''
Original: https://blog.csdn.net/qq_55342245/article/details/121474148
Author: 今天多喝热水
Title: pandas的简单使用(查询)
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/675041/
转载文章受原作者版权保护。转载请注明原作者出处!