pandas学习

import pandas as pd

result = pd.Series([2,2,3,4,5,5]).unique() #去除值中重复值每个值,只保留一个
print(result)
[2 3 4 5]
count = pd.Series([2,2,3,4,5,5]).nunique() #去除值中重复值,每个值只保留一个,并且统计数量
print(count)
print(pd.Series([2,2,3,4,5,5]).value_counts()) #统计值中各数据出现次数
4
2    2
5    2
3    1
4    1
dtype: int64
#将Series看着字典
s_1 = pd.Series(data=[2,3,4,5,10],index = list('ABCDE'))
print(s_1)
print(s_1['C'])
print(s_1.keys)
print(s_1.index)
print(s_1.values)
print(s_1.items()) #获取索引和值对
print('B' in s_1) #判断是否包含某个索引
s_1['C'] = 30 #修改某个索引值
print(s_1)
A     2
B     3
C     4
D     5
E    10
dtype: int64
4
<bound method Series.keys of A     2
B     3
C     4
D     5
E    10
dtype: int64>
Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
[ 2  3  4  5 10]
<zip object at 0x7fcc0b54a440>
True
A     2
B     3
C    30
D     5
E    10
dtype: int64

#通过索引,切片,布尔达表达式访问数据
s_1 = pd.Series(data=[2,3,4,5,10],index = list('ABCDE'))

print(s_1[2]) #第三个值 6
print(s_1['A':'B']) #包括A和D对应的值
print(s_1[1:4]) #包括1但是不包括4
print(s_1 > 5)  #所有大于5的值
4
A    2
B    3
dtype: int64
B    3
C    4
D    5
dtype: int64
A    False
B    False
C    False
D    False
E     True
dtype: bool
#索引器:loc,iloc
s_2 = pd.Series(range(2,12,2),index=range(1,6))
print(s_2)
print(s_2.iloc[2]) #隐式索引
print(s_2.loc[2]) #显示索引
print(s_2[2:4]) #包括2不包括4
print(s_2.loc[2:4]) #包括2包括4
1     2
2     4
3     6
4     8
5    10
dtype: int64
6
4
3    6
4    8
dtype: int64
2    4
3    6
4    8
dtype: int64
#series常用方法
s_3 = pd.Series([8,4,7,3],index=list('ACBD'))
print(s_3)
print("======")
print(s_3.sort_index()) #根据索引排序
print(s_3.sort_values()) #根据值排序
print(s_3.rank()) #排名
#print(s_3.reindex(list('BCFE'))) #重新设置索引
print(s_3.reindex(list('BCFEQ'),fill_value=0)) #重新设置索引,缺省值 0补齐
import numpy as np
print(np.square(s_3))
print(s_3 + s_3)
A    8
C    4
B    7
D    3
dtype: int64
======
A    8
B    7
C    4
D    3
dtype: int64
D    3
C    4
B    7
A    8
dtype: int64
A    4.0
C    2.0
B    3.0
D    1.0
dtype: float64
B    7
C    4
F    0
E    0
Q    0
dtype: int64
A    64
C    16
B    49
D     9
dtype: int64
A    16
C     8
B    14
D     6
dtype: int64

基本机构之DataFream(既有行索引,又有列索引的二维数组)
类似于Excel表或关系型数据库中的二维表

可通过值为一维ndarray,list, dict或者Series的字典或列表;二维的ndarray;单个Series、列表、一维数组,此时DataFrame中只有一列;其他的DataFrame等创建;

#DataFrame 创建实例
names = ['张三','李四','王五']
ages = [20,18,19]
d1 = pd.DataFrame({'姓名':names,'年龄':ages})
print(d1)
d2 = pd.DataFrame([names,ages])
print(d2)
   姓名  年龄
0  张三  20
1  李四  18
2  王五  19
    0   1   2
0  张三  李四  王五
1  20  18  19
import pandas as pd
import numpy as np
names = ['张三','李四','王五']
ages = [20,18,19]
s_names = pd.Series(names,index=['A','B','C'])
s_ages = pd.Series(ages,index=['B','C','D'])
d3 = pd.DataFrame({'姓名':s_names,'年龄':s_ages})
print(d3)
print(pd.DataFrame([names,ages]))
d4 = pd.DataFrame(np.random.randint(10,30,(3,4)))
print(d4)
s_name = {'A01':'江西财大','A05':'南昌大学','A08':'江西农大'}
s_type = {'A05':'综合类','A01':'财经类','A06':'师范类'}
d5 = pd.DataFrame({"学校名称":s_name,"学校类型":s_type})
print(d5)
    姓名    年龄
A   张三   NaN
B   李四  20.0
C   王五  18.0
D  NaN  19.0
    0   1   2
0  张三  李四  王五
1  20  18  19
    0   1   2   3
0  22  22  12  22
1  27  29  24  12
2  15  21  29  14
     学校名称 学校类型
A01  江西财大  财经类
A05  南昌大学  综合类
A08  江西农大  NaN
A06   NaN  师范类

dataframe中数据访问

1、以列的索引为关键字,获取某一列数据,例如d_1[列索引],结果为Series对象,可进一步获取某个数据,例如d_1[列索引][行索引],需要使用两个中括号,不能合并; 2、如果列的索引为字符串,则可以列名为属性名,获取某一列数据,例如d_1.属性名,前提是列名符合标识符的命名规范。如果列名不符合规范或与 DataFrame 中属性相同,例如shape、index等,则不能用属性形式。
s_names = pd.Series(['张三','李四','王麻子','赵六','钱七'],index=list('ABCDE'))
s_ages = pd.Series([18,20,18,19],index=list('ABCD'))
d_1 = pd.DataFrame({"姓名":s_names,"年龄":s_ages})
print(d_1)
print(d_1['姓名'])
print(d_1.姓名)
print(d_1['姓名'] is d_1.姓名) #是否为同一对象
print(d_1['姓名']['B'])
    姓名    年龄
A   张三  18.0
B   李四  20.0
C  王麻子  18.0
D   赵六  19.0
E   钱七   NaN
A     张三
B     李四
C    王麻子
D     赵六
E     钱七
Name: 姓名, dtype: object
A     张三
B     李四
C    王麻子
D     赵六
E     钱七
Name: 姓名, dtype: object
True
李四

将datafream看做二维数组

支持行转置,布尔表达式等
支持行切片,不支持列切片,若想访问多数据列,可将多个列索引放在列表中,例如d_1[[列1,列2]]
print(d_1.T)
print(d_1[d_1.年龄 == 18]) #布尔表达式
print(d_1[1:3]) #行切片,隐式索引
print(d_1['A':'D']) #行切片,显示索引
print(d_1[['年龄','姓名']]) #同时获取多列信息
print(d_1.iloc[3,1]) #根据位置取值
# print(d_1.iloc[1:3,0:1]) #根据位置切片
print(d_1.loc["D","姓名"])#根据显示索引取值
print(d_1.loc['A':'D','姓名':'年龄'])
       A     B     C     D    E
姓名    张三    李四   王麻子    赵六   钱七
年龄  18.0  20.0  18.0  19.0  NaN
    姓名    年龄
A   张三  18.0
C  王麻子  18.0
    姓名    年龄
B   李四  20.0
C  王麻子  18.0
    姓名    年龄
A   张三  18.0
B   李四  20.0
C  王麻子  18.0
D   赵六  19.0
     年龄   姓名
A  18.0   张三
B  20.0   李四
C  18.0  王麻子
D  19.0   赵六
E   NaN   钱七
19.0
赵六
    姓名    年龄
A   张三  18.0
B   李四  20.0
C  王麻子  18.0
D   赵六  19.0

dataframe常见属性

shape:获取形状信息,结果为一个元组
dtypes:获取各字段的数据类型,结果为Series
values:获取数据内容,结果为二维数组
columns:获取列索引,即字段名称,结果为index
index:获取行索引,即行的标签结果为index
axes:同时获取行和列索引,结果为index列表
print(d_1.shape)
print(d_1.dtypes)
print(d_1.values)
print(d_1.columns)
print(d_1.index)
print(d_1.axes)
(5, 2)
姓名     object
年龄    float64
dtype: object
[['张三' 18.0]
 ['李四' 20.0]
 ['王麻子' 18.0]
 ['赵六' 19.0]
 ['钱七' nan]]
Index(['姓名', '年龄'], dtype='object')
Index(['A', 'B', 'C', 'D', 'E'], dtype='object')
[Index(['A', 'B', 'C', 'D', 'E'], dtype='object'), Index(['姓名', '年龄'], dtype='object')]

dataframe常见方法

d_1 = pd.DataFrame(np.random.randint(10,30,(20,10)),index=[chr(x) for x in range(116,96,-1)],columns=[chr(x) for x in range(65,75)])
print(d_1)
    A   B   C   D   E   F   G   H   I   J
t  22  23  11  22  26  14  16  28  28  15
s  26  22  13  12  22  18  17  17  27  16
r  12  19  18  13  27  15  17  25  24  23
q  26  22  24  19  27  16  18  27  25  17
p  23  25  12  12  19  21  19  21  24  17
o  24  10  16  16  10  21  14  25  21  18
n  24  10  20  23  10  10  17  10  26  16
m  29  24  11  11  29  13  16  19  28  15
l  10  24  20  13  26  12  27  21  19  11
k  26  14  11  10  24  15  10  17  27  29
j  14  28  25  21  16  19  27  12  26  17
i  21  26  17  15  21  13  27  15  29  22
h  13  13  10  27  24  27  25  29  19  13
g  12  25  20  29  24  26  13  14  13  22
f  11  22  12  11  13  16  12  26  22  23
e  21  11  23  24  21  13  28  16  26  13
d  23  18  24  13  21  16  18  20  29  14
c  19  11  17  22  28  23  11  29  13  14
b  27  16  18  28  19  10  22  17  11  14
a  16  25  10  19  15  13  28  28  25  28
print(d_1.info()) #基本信息,包括行列索引信息,每列非空元素数量,每列元素数据的类型,整体所占内存大小等
print(d_1.head(5)) #获取前N行数据
print(d_1.tail(3))#获取后N行数据
<class 'pandas.core.frame.DataFrame'>
Index: 20 entries, t to a
Data columns (total 10 columns):
 #   Column  Non-Null Count  Dtype
---  ------  --------------  -----
 0   A       20 non-null     int64
 1   B       20 non-null     int64
 2   C       20 non-null     int64
 3   D       20 non-null     int64
 4   E       20 non-null     int64
 5   F       20 non-null     int64
 6   G       20 non-null     int64
 7   H       20 non-null     int64
 8   I       20 non-null     int64
 9   J       20 non-null     int64
dtypes: int64(10)
memory usage: 1.7+ KB
None
    A   B   C   D   E   F   G   H   I   J
t  22  23  11  22  26  14  16  28  28  15
s  26  22  13  12  22  18  17  17  27  16
r  12  19  18  13  27  15  17  25  24  23
q  26  22  24  19  27  16  18  27  25  17
p  23  25  12  12  19  21  19  21  24  17
    A   B   C   D   E   F   G   H   I   J
c  19  11  17  22  28  23  11  29  13  14
b  27  16  18  28  19  10  22  17  11  14
a  16  25  10  19  15  13  28  28  25  28
print(d_1.describe())#数据的整体描述信息,包括:非空值数量,平均值,标准差,最小值,最大值
               A          B         C          D          E         F  \
count  20.000000  20.000000  20.00000  20.000000  20.000000  20.00000   
mean   19.950000  19.400000  16.60000  18.000000  21.100000  16.55000   
std     6.091193   6.021016   5.11345   6.189975   5.793826   4.90408   
min    10.000000  10.000000  10.00000  10.000000  10.000000  10.00000   
25%    13.750000  13.750000  11.75000  12.750000  18.250000  13.00000   
50%    21.500000  22.000000  17.00000  17.500000  21.500000  15.50000   
75%    24.500000  24.250000  20.00000  22.250000  26.000000  19.50000   
max    29.000000  28.000000  25.00000  29.000000  29.000000  27.00000   

              G         H          I          J  
count  20.00000  20.00000  20.000000  20.000000  
mean   19.10000  20.80000  23.100000  17.850000  
std     6.00789   5.99649   5.485867   5.018649  
min    10.00000  10.00000  11.000000  11.000000  
25%    15.50000  16.75000  20.500000  14.000000  
50%    17.50000  20.50000  25.000000  16.500000  
75%    25.50000  26.25000  27.000000  22.000000  
max    28.00000  29.00000  29.000000  29.000000  
print(d_1.count())#统计各列中非空值的数量,结果为series
print(d_1.sample(2,axis=0)) #随机抽取4行
print(d_1.sample(2,axis=1)) #随机抽取4列
A    20
B    20
C    20
D    20
E    20
F    20
G    20
H    20
I    20
J    20
dtype: int64
    A   B   C   D   E   F   G   H   I   J
c  19  11  17  22  28  23  11  29  13  14
h  13  13  10  27  24  27  25  29  19  13
    J   H
t  15  28
s  16  17
r  23  25
q  17  27
p  17  21
o  18  25
n  16  10
m  15  19
l  11  21
k  29  17
j  17  12
i  22  15
h  13  29
g  22  14
f  23  26
e  13  16
d  14  20
c  14  29
b  14  17
a  28  28
#apply(fun,axis) 对每一行或者每一列元素执行函数
print(d_1.apply(np.sum,axis=1))#对列执行加和 相当于对行压缩
print(d_1.apply(np.sum,axis=0))#对行执行加和 相当于对列压缩
t    205
s    190
r    193
q    221
p    193
o    175
n    166
m    195
l    183
k    183
j    205
i    206
h    200
g    198
f    168
e    196
d    196
c    187
b    182
a    207
dtype: int64
A    399
B    388
C    332
D    360
E    422
F    331
G    382
H    416
I    462
J    357
dtype: int64
print(d_1.applymap(np.square)) #对每个元素求平方
print(d_1.to_dict(orient="list")) #转换为字典
     A    B    C    D    E    F    G    H    I    J
t  484  529  121  484  676  196  256  784  784  225
s  676  484  169  144  484  324  289  289  729  256
r  144  361  324  169  729  225  289  625  576  529
q  676  484  576  361  729  256  324  729  625  289
p  529  625  144  144  361  441  361  441  576  289
o  576  100  256  256  100  441  196  625  441  324
n  576  100  400  529  100  100  289  100  676  256
m  841  576  121  121  841  169  256  361  784  225
l  100  576  400  169  676  144  729  441  361  121
k  676  196  121  100  576  225  100  289  729  841
j  196  784  625  441  256  361  729  144  676  289
i  441  676  289  225  441  169  729  225  841  484
h  169  169  100  729  576  729  625  841  361  169
g  144  625  400  841  576  676  169  196  169  484
f  121  484  144  121  169  256  144  676  484  529
e  441  121  529  576  441  169  784  256  676  169
d  529  324  576  169  441  256  324  400  841  196
c  361  121  289  484  784  529  121  841  169  196
b  729  256  324  784  361  100  484  289  121  196
a  256  625  100  361  225  169  784  784  625  784
{'A': [22, 26, 12, 26, 23, 24, 24, 29, 10, 26, 14, 21, 13, 12, 11, 21, 23, 19, 27, 16], 'B': [23, 22, 19, 22, 25, 10, 10, 24, 24, 14, 28, 26, 13, 25, 22, 11, 18, 11, 16, 25], 'C': [11, 13, 18, 24, 12, 16, 20, 11, 20, 11, 25, 17, 10, 20, 12, 23, 24, 17, 18, 10], 'D': [22, 12, 13, 19, 12, 16, 23, 11, 13, 10, 21, 15, 27, 29, 11, 24, 13, 22, 28, 19], 'E': [26, 22, 27, 27, 19, 10, 10, 29, 26, 24, 16, 21, 24, 24, 13, 21, 21, 28, 19, 15], 'F': [14, 18, 15, 16, 21, 21, 10, 13, 12, 15, 19, 13, 27, 26, 16, 13, 16, 23, 10, 13], 'G': [16, 17, 17, 18, 19, 14, 17, 16, 27, 10, 27, 27, 25, 13, 12, 28, 18, 11, 22, 28], 'H': [28, 17, 25, 27, 21, 25, 10, 19, 21, 17, 12, 15, 29, 14, 26, 16, 20, 29, 17, 28], 'I': [28, 27, 24, 25, 24, 21, 26, 28, 19, 27, 26, 29, 19, 13, 22, 26, 29, 13, 11, 25], 'J': [15, 16, 23, 17, 17, 18, 16, 15, 11, 29, 17, 22, 13, 22, 23, 13, 14, 14, 14, 28]}
d_2 = pd.DataFrame(np.random.randint(50,80,(5,4)),columns=list('ABCD'),index=list('abcde'))
print(d_1.append(d_2))
    A   B   C   D     E     F     G     H     I     J
t  22  23  11  22  26.0  14.0  16.0  28.0  28.0  15.0
s  26  22  13  12  22.0  18.0  17.0  17.0  27.0  16.0
r  12  19  18  13  27.0  15.0  17.0  25.0  24.0  23.0
q  26  22  24  19  27.0  16.0  18.0  27.0  25.0  17.0
p  23  25  12  12  19.0  21.0  19.0  21.0  24.0  17.0
o  24  10  16  16  10.0  21.0  14.0  25.0  21.0  18.0
n  24  10  20  23  10.0  10.0  17.0  10.0  26.0  16.0
m  29  24  11  11  29.0  13.0  16.0  19.0  28.0  15.0
l  10  24  20  13  26.0  12.0  27.0  21.0  19.0  11.0
k  26  14  11  10  24.0  15.0  10.0  17.0  27.0  29.0
j  14  28  25  21  16.0  19.0  27.0  12.0  26.0  17.0
i  21  26  17  15  21.0  13.0  27.0  15.0  29.0  22.0
h  13  13  10  27  24.0  27.0  25.0  29.0  19.0  13.0
g  12  25  20  29  24.0  26.0  13.0  14.0  13.0  22.0
f  11  22  12  11  13.0  16.0  12.0  26.0  22.0  23.0
e  21  11  23  24  21.0  13.0  28.0  16.0  26.0  13.0
d  23  18  24  13  21.0  16.0  18.0  20.0  29.0  14.0
c  19  11  17  22  28.0  23.0  11.0  29.0  13.0  14.0
b  27  16  18  28  19.0  10.0  22.0  17.0  11.0  14.0
a  16  25  10  19  15.0  13.0  28.0  28.0  25.0  28.0
a  77  52  65  57   NaN   NaN   NaN   NaN   NaN   NaN
b  74  50  77  77   NaN   NaN   NaN   NaN   NaN   NaN
c  74  79  62  50   NaN   NaN   NaN   NaN   NaN   NaN
d  77  60  64  58   NaN   NaN   NaN   NaN   NaN   NaN
e  66  56  79  79   NaN   NaN   NaN   NaN   NaN   NaN


/var/folders/2s/7x6vd9311ds7xh_gn5tvvg2c0000gn/T/ipykernel_6964/2841885800.py:2: FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.
  print(d_1.append(d_2))

DataFrame的合并操作

DataFrame中提供了一个join()方法用于将其他DataFrame中的列合并到当前DataFrame中,类似于数据库中的连接,支持内连接(只保留两个对象中都存在的行索引对应的数据)、外连接(保留两个对象中,只要有一方存在的行索引对应的数据,如果另一方不存在则相应值为NaN)、左连接(只保留左边对象中的所有行索引对应的数据)和右连接(只保留左边对象中的所有行索引对应的数据)等,默认情况采用左连接。join()方法合并数据时,默认根据两个对象的行索引进行匹配连接,如果有相同列名,则需指定后缀以区分,否则会出错,也可通过on参数指定合并时参考的列,此时需将该列作为其他对象的行索引,也就是说让另一个对象的行索引和当前对象的on进行匹配。
s_names = pd.Series(['张三','李四','王五','赵六','钱七'],index=list("ZBCDE"))
s_ages = pd.Series([18,20,18,19],index=list('ADBC'))
s_nums = pd.Series(["001","003","006","008"],index=list("ADCE"))
s_names_2 = pd.Series(["张三","李四","孙五","周六"],index=list('ADCE'))
d1 = pd.DataFrame({"姓名":s_names,"年龄":s_ages})
d2 = pd.DataFrame({"姓名":s_names_2,"学号":s_nums})
print(d1)
print(d2)
print(d1.join(d2,rsuffix="_r")) #默认左连接 根据行索引相等匹配
print(d1.join(d2.set_index("姓名"),on="姓名")) #默认左连接  根据姓名相同匹配
print(d1.join(d2.set_index("姓名"),on="姓名",how="right")) #右连接  根据姓名相同匹配
print(d1.join(d2.set_index("姓名"),on="姓名",how="inner")) #内连接  根据姓名相同匹配 相当于索引的交集
print(d1.join(d2.set_index("姓名"),on="姓名",how="outer")) #外连接  根据姓名相同匹配 相当于索引的并集
    姓名    年龄
A  NaN  18.0
B   李四  18.0
C   王五  19.0
D   赵六  20.0
E   钱七   NaN
Z   张三   NaN
   姓名   学号
A  张三  001
D  李四  003
C  孙五  006
E  周六  008
    姓名    年龄 姓名_r   学号
A  NaN  18.0   张三  001
B   李四  18.0  NaN  NaN
C   王五  19.0   孙五  006
D   赵六  20.0   李四  003
E   钱七   NaN   周六  008
Z   张三   NaN  NaN  NaN
    姓名    年龄   学号
A  NaN  18.0  NaN
B   李四  18.0  003
C   王五  19.0  NaN
D   赵六  20.0  NaN
E   钱七   NaN  NaN
Z   张三   NaN  001
     姓名    年龄   学号
Z    张三   NaN  001
B    李四  18.0  003
NaN  孙五   NaN  006
NaN  周六   NaN  008
   姓名    年龄   学号
B  李四  18.0  003
Z  张三   NaN  001
      姓名    年龄   学号
A    NaN  18.0  NaN
B     李四  18.0  003
C     王五  19.0  NaN
D     赵六  20.0  NaN
E     钱七   NaN  NaN
Z     张三   NaN  001
NaN   孙五   NaN  006
NaN   周六   NaN  008

pandas加载数据

read_excel():从excel文件中读取数据;
read_csv():从csv文件中读取数据;
read_clipboard():从剪切板中数据;
read_html():从网页中读取数据;
read_json():从 json 格式文本中读取数据;
read_pickle():从pickle文件中读取数据;
设置Excel的属性
io:文件路径,可以是本地文件也可以是网络文件,支持xls、xlsx、xlsm等格式;
sheet_name:表单序号或名称,可以是一个列表,表示同时读取多个表单,默认为第一个表单;
hearder:表头,可以是整数或整数列表,默认为第一行;
names:指定列名,默认为表头;
index_col:索引列,可以是整数或整数列表;
usecols:使用到的列,默认加载所有列,如果需要加载某些列可指定这些列的序号;
dtype:指定每一列的数据类型;
skiprows:跳过多少行,常用于表的最开始几行为说明性文档的情景;
nrows:解析多少行;
数据显示的方法及关键属性
get_option(属性名):获取相应的属性值;
set_option(属性名,值):设置相应的属性值;
reset_option(属性名):重置相应的属性值,恢复成默认值;
describe_option(属性名):获取相应的属性描述信息,包括默认值,当前值等信息;
option_context(属性名):设置临时的属性值,主要用于上下文管理器中;
显示设置中经常使用到的一些属性如下:
display.max_rows:显示的最大行数,默认为60行,超过60行时,只显示前5行、后5行,其他行用省略号表示,None表示不限制,显示所有行;
display.max_columns:显示的最大列数,默认为0,根据宽度自动确定,显示不下时,中间列用省略号表示,None表示不限制,显示所有;
display.expand_frame_repr:是否换行打印超过宽度的数据,默认为True,当不限制列的数量,同时一行又放不下那么多列信息时,默认会自动换行,可设置为False,这样会添加水平滚动条,在一行显示;
display_max_colwidth:显示的最大列宽,默认为50个字符,超出以省略号表示,None表示不限制;
display.precision:设置小数显示精度,默认为6位。
缺失值处理方法
删除法:直接将包含缺失值的记录删除,常用于缺失值比例非常低,如5%以内;
替换法:用某种值直接替换缺失值,例如连续变量的均值或中位数,离散变量的众数等;
插补法:根据其他已观测值进行预测,例如K近邻、回归插补法等;
Pandas中提供了强大的缺失值处理,相关方法如下:
dropna():删除包含缺失值的行,可通过axis参数设置删除所在列,通过thresh参数指定阈值,只有非空值大于该阈值的行或列才保留;
fillna():用指定值填充缺失值,可为不同的列指定不同的填充值,此时传递一个字典,键为列名,值为该列缺失值的填充值,可通过method参数指定填充方式;通过limit参数限定填充的数量;
isna()或isnull():判断元素是否为缺失值,如果元素为缺失值,则对应位置为True,否则为False。
import pandas as pd
data = pd.read_csv('anime.csv',encoding='utf-8')
print(data.info())
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 12294 entries, 0 to 12293
Data columns (total 7 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   anime_id  12294 non-null  int64  
 1   name      12294 non-null  object 
 2   genre     12232 non-null  object 
 3   type      12269 non-null  object 
 4   episodes  12294 non-null  object 
 5   rating    12064 non-null  float64
 6   members   12294 non-null  int64  
dtypes: float64(1), int64(2), object(4)
memory usage: 672.5+ KB
None
import numpy as np
s_names = ['aa','bb','cc','dd','ee','ff','gg','hh','mm','nn']
s_sex = np.random.choice(['男','女'],size = len(s_names))
s_class = np.random.choice(['A','B','C'],size=len(s_names))
score = np.random.choice(range(50,100),size=len(s_names))
p_1 = pd.DataFrame({'班级':s_class,'姓名':s_names,'性别':s_sex,'分数':score})
print(p_1)
group = p_1.groupby('班级')
print(group.groups)
print(group.agg({'分数':[np.min,np.max]}))
# 当transform作用于单列Series时较为简单 ,对salary列进行transform变换我们可以传入任意的非聚合类函数
# p_1['min_fen'] = group['分数'].transform(lambda x:x - np.min(x)) #按照分组 A,B,C分成三类,去当中最小值,然后分别与分类中的元素进行相减
# print(p_1)
print(group.filter(lambda x:np.mean(x['分数']) > 80))
print(p_1.groupby(['班级','性别'])['分数'].mean())

  班级  姓名 性别  分数
0  B  aa  男  59
1  A  bb  女  94
2  A  cc  女  50
3  C  dd  男  83
4  C  ee  女  74
5  C  ff  男  54
6  A  gg  男  77
7  B  hh  女  63
8  C  mm  女  54
9  C  nn  男  67
{'A': [1, 2, 6], 'B': [0, 7], 'C': [3, 4, 5, 8, 9]}
     分数     
   amin amax
班级          
A    50   94
B    59   63
C    54   83
Empty DataFrame
Columns: [班级, 姓名, 性别, 分数]
Index: []
班级  性别
A   女     72.0
    男     77.0
B   女     63.0
    男     59.0
C   女     64.0
    男     68.0
Name: 分数, dtype: float64

Pandas中的数据合并操作

数据合并是指将多个数据按照一定的规则合并到一起。在实际应用中,常常涉及多个数据的联合操作,而这些数据又保存在不同的文件中,此时需要先进行合并,再执行相关操作。Pandas中提供了一些数据合并的方法,例如merge()、contact()等。
merge()方法,按照某列或某些列将两个数据对象进行合并,与前面介绍的DataFrame中的join()方法非常相似。
left:左边的数据对象;
right:右边的数据对象;
how:连接方式,默认为inner,此外还有left、right、outer等;
on:连接的列名称,必须在两个对象中,默认以两个对象的列名的交集作为连接键;
left_on:左边对象中用于连接的键的列名;
right_on:右边对象中用于连接的键的列名;
left_index:使用左边的行索引作为连接键;
right_index:使用右边的行索引作为连接键;
sort:是否将合并的数据排序,默认为False;
suffixes:列名相同时,指定的后缀。
s_names = pd.Series(['张三','李四','王五','赵六','钱七'],index=list('ABCDE'))
s_ages = pd.Series([18,20,18,19],index=list('ADBC'))
s_nums = pd.Series(['001','003','006','008'],index=list('ADCE'))
s_names_2 = pd.Series(['张三','李四','孙五','周六'],index= list('ADCE'))
d_1 = pd.DataFrame({'姓名':s_names,'年龄':s_ages})
print(d_1)
d_2 = pd.DataFrame({'姓名':s_names_2,'学号':s_nums})
print(d_2)
print(pd.merge(d_1,d_2)) #以姓名作为连接
# print(pd.merge(d_1,d_2,how='left'))
# print(pd.merge(d_1,d_2,how='right'))
# print(pd.merge(d_1,d_2,how='outer')) #相当于并集
print(pd.merge(d_1,d_2,left_index=True,right_index=True))
   姓名    年龄
A  张三  18.0
B  李四  18.0
C  王五  19.0
D  赵六  20.0
E  钱七   NaN
   姓名   学号
A  张三  001
D  李四  003
C  孙五  006
E  周六  008
   姓名    年龄   学号
0  张三  18.0  001
1  李四  18.0  003
  姓名_x    年龄 姓名_y   学号
A   张三  18.0   张三  001
C   王五  19.0   孙五  006
D   赵六  20.0   李四  003
E   钱七   NaN   周六  008

contact()方法,沿着一条轴,将多个对象堆叠起来,关键参数如下:

objs:需合并的对象序列;
axis:指定合并的轴,0/‘index’, 1/‘columns’,默认为0;
join:连接方式,只有inner和outer,默认为outer;
ignore_index:是否忽略索引,默认为False;
verify_integrity:验证完整性,较为耗时,默认为False;
print(pd.concat([d_1,d_2],axis=0))
print(pd.concat([d_1,d_2],axis=1))
print(pd.concat([d_1,d_2],axis=1,join='inner'))
   姓名    年龄   学号
A  张三  18.0  NaN
B  李四  18.0  NaN
C  王五  19.0  NaN
D  赵六  20.0  NaN
E  钱七   NaN  NaN
A  张三   NaN  001
D  李四   NaN  003
C  孙五   NaN  006
E  周六   NaN  008
   姓名    年龄   姓名   学号
A  张三  18.0   张三  001
B  李四  18.0  NaN  NaN
C  王五  19.0   孙五  006
D  赵六  20.0   李四  003
E  钱七   NaN   周六  008
   姓名    年龄  姓名   学号
A  张三  18.0  张三  001
C  王五  19.0  孙五  006
D  赵六  20.0  李四  003
E  钱七   NaN  周六  008
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sunnyboy_4

你的鼓励是我创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值