Datawhale--组队学习第12期--pandas基础学习---第1章 Pandas基础

第1章 Pandas基础

import pandas as pd
import numpy as np
查看Pandas版本
pd.__version__
'1.0.1'
#如何更新

这种地方很容易出错,刚刚又找了很久…总是有奇怪的事情,cmd里 pip list 里显示pandas已经是1.0.3,但jupyter里不知道咋回事。。。。

一、文件读取与写入

1. 读取

(a)csv格式
#路径地址问题   斜杠??
df = pd.read_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\table.csv')
df.head()

已解决:
结论:
(1)浏览器地址栏网址使用 斜杆/ ;
(2)windows文件浏览器上使用 反斜杠\ ;
(3)出现在html url() 属性中的路径,指定的路径是网络路径,所以必须用 斜杆/ ;
(4)出现在普通字符串中的路径,如果代表的是windows文件路径,则使用 斜杆/ 和 反斜杠\ 是一样的;如果代表的是网络文件路径,则必须使用 斜杆/ ;

而"\"则表示反斜杠\的转义字符,在编程中常用于表示反斜杠\不是普通的字符,而是路径的分隔符。如用一个字符串存储保存文件的路径时,路径为D:\badboy\html\images.jpg;则用字符串存储时,应该写为str=D:\badboy\html\image.jpg;
因为若不这样表示,则反斜杠\将会当作普通字符,而非路径的分隔符。

SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
1S_1C_11102Fstreet_21927332.5B+
2S_1C_11103Mstreet_21868287.2B+
3S_1C_11104Fstreet_21678180.4B-
4S_1C_11105Fstreet_41596484.8B+
(b)txt格式
df_txt = pd.read_table('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\table.txt') #可设置sep分隔符参数
df_txt
col1col2col3col4
02a1.4apple
13b3.4banana
26c2.5orange
35d3.2lemon
(c)xls或xlsx格式
#需要安装xlrd包
df_excel = pd.read_excel('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\table.xlsx')
df_excel.head()
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
1S_1C_11102Fstreet_21927332.5B+
2S_1C_11103Mstreet_21868287.2B+
3S_1C_11104Fstreet_21678180.4B-
4S_1C_11105Fstreet_41596484.8B+

2. 写入

(a)csv格式
df.to_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\table.csv')
#df.to_csv('data/new_table.csv', index=False) #保存时除去行索引
(b)xls或xlsx格式
#需要安装openpyxl
df.to_excel('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\new_table2.xlsx', sheet_name='Sheet1')

二、基本数据结构

1. Series

(a)创建一个Series
对于一个Series,其中最常用的属性为值(values),索引(index),名字(name),类型(dtype)
s = pd.Series(np.random.randn(5),index=['a','b','c','d','e'],name='这是一个Series',dtype='float64')
s
a    0.800223
b    0.361857
c   -0.408613
d    0.604911
e    1.293048
Name: 这是一个Series, dtype: float64
(b)访问Series属性
s.values
array([ 0.8002227 ,  0.361857  , -0.40861274,  0.60491064,  1.29304789])
s.name
'这是一个Series'
s.index
Index(['a', 'b', 'c', 'd', 'e'], dtype='object')
s.dtype
dtype('float64')
(c)取出某一个元素
将在第2章详细讨论索引的应用,这里先大致了解
s['a']
0.8002227007772154
(d)调用方法
s.mean()
0.5302850965272142
Series有相当多的方法可以调用:
print([attr for attr in dir(s) if not attr.startswith('_')])
['T', 'a', 'abs', 'add', 'add_prefix', 'add_suffix', 'agg', 'aggregate', 'align', 'all', 'any', 'append', 'apply', 'argmax', 'argmin', 'argsort', 'array', 'asfreq', 'asof', 'astype', 'at', 'at_time', 'attrs', 'autocorr', 'axes', 'b', 'between', 'between_time', 'bfill', 'bool', 'c', 'clip', 'combine', 'combine_first', 'convert_dtypes', 'copy', 'corr', 'count', 'cov', 'cummax', 'cummin', 'cumprod', 'cumsum', 'd', 'describe', 'diff', 'div', 'divide', 'divmod', 'dot', 'drop', 'drop_duplicates', 'droplevel', 'dropna', 'dtype', 'dtypes', 'duplicated', 'e', 'empty', 'eq', 'equals', 'ewm', 'expanding', 'explode', 'factorize', 'ffill', 'fillna', 'filter', 'first', 'first_valid_index', 'floordiv', 'ge', 'get', 'groupby', 'gt', 'hasnans', 'head', 'hist', 'iat', 'idxmax', 'idxmin', 'iloc', 'index', 'infer_objects', 'interpolate', 'is_monotonic', 'is_monotonic_decreasing', 'is_monotonic_increasing', 'is_unique', 'isin', 'isna', 'isnull', 'item', 'items', 'iteritems', 'keys', 'kurt', 'kurtosis', 'last', 'last_valid_index', 'le', 'loc', 'lt', 'mad', 'map', 'mask', 'max', 'mean', 'median', 'memory_usage', 'min', 'mod', 'mode', 'mul', 'multiply', 'name', 'nbytes', 'ndim', 'ne', 'nlargest', 'notna', 'notnull', 'nsmallest', 'nunique', 'pct_change', 'pipe', 'plot', 'pop', 'pow', 'prod', 'product', 'quantile', 'radd', 'rank', 'ravel', 'rdiv', 'rdivmod', 'reindex', 'reindex_like', 'rename', 'rename_axis', 'reorder_levels', 'repeat', 'replace', 'resample', 'reset_index', 'rfloordiv', 'rmod', 'rmul', 'rolling', 'round', 'rpow', 'rsub', 'rtruediv', 'sample', 'searchsorted', 'sem', 'set_axis', 'shape', 'shift', 'size', 'skew', 'slice_shift', 'sort_index', 'sort_values', 'squeeze', 'std', 'sub', 'subtract', 'sum', 'swapaxes', 'swaplevel', 'tail', 'take', 'to_clipboard', 'to_csv', 'to_dict', 'to_excel', 'to_frame', 'to_hdf', 'to_json', 'to_latex', 'to_list', 'to_markdown', 'to_numpy', 'to_period', 'to_pickle', 'to_sql', 'to_string', 'to_timestamp', 'to_xarray', 'transform', 'transpose', 'truediv', 'truncate', 'tshift', 'tz_convert', 'tz_localize', 'unique', 'unstack', 'update', 'value_counts', 'values', 'var', 'view', 'where', 'xs']

2. DataFrame

(a)创建一个DataFrame
df = pd.DataFrame({'col1':list('abcde'),'col2':range(5,10),'col3':[1.3,2.5,3.6,4.6,5.8]},
                 index=list('一二三四五'))
df
col1col2col3
a51.3
b62.5
c73.6
d84.6
e95.8
#quantile(分位数)/cummax(返回一个DataFrame或Series轴上的累积最大值)/cumsum/cumprod
#(返回包含累计产品的相同大小的DataFrame或Series)
df.quantile(q=0.75,axis=0,numeric_only=True)

col2    8.0
col3    4.6
Name: 0.75, dtype: float64
(b)从DataFrame取出一列为Series
df['col1']
一    a
二    b
三    c
四    d
五    e
Name: col1, dtype: object
type(df)
pandas.core.frame.DataFrame
type(df['col1'])
pandas.core.series.Series
(c)修改行或列名
df.rename(index={'一':'one'},columns={'col1':'new_col1'})
new_col1col2col3
onea51.3
b62.5
c73.6
d84.6
e95.8
(d)调用属性和方法
df.index
Index(['一', '二', '三', '四', '五'], dtype='object')
df.columns
Index(['col1', 'col2', 'col3'], dtype='object')
df.values
array([['a', 5, 1.3],
       ['b', 6, 2.5],
       ['c', 7, 3.6],
       ['d', 8, 4.6],
       ['e', 9, 5.8]], dtype=object)
df.shape
(5, 3)
df.mean() #本质上是一种Aggregation操作,将在第3章详细介绍
col2    7.00
col3    3.56
dtype: float64
(e)索引对齐特性
这是Pandas中非常强大的特性,不理解这一特性有时就会造成一些麻烦
df1 = pd.DataFrame({'A':[1,2,3]},index=[1,2,3])
df2 = pd.DataFrame({'A':[1,2,3]},index=[3,1,2])
df1-df2 #由于索引对齐,因此结果不是0
A
1-1
2-1
32
(f)列的删除与添加
对于删除而言,可以使用drop函数或del或pop
df.drop(index='五',columns='col1') #设置inplace=True后会直接在原DataFrame中改动
col2col3
51.3
62.5
73.6
84.6
df['col1']=[1,2,3,4,5]
del df['col1']
df
col2col3
51.3
62.5
73.6
84.6
95.8
pop方法直接在原来的DataFrame上操作,且返回被删除的列,与python中的pop函数类似
df['col1']=[1,2,3,4,5]
df.pop('col1')
一    1
二    2
三    3
四    4
五    5
Name: col1, dtype: int64
df
col2col3
51.3
62.5
73.6
84.6
95.8
可以直接增加新的列,也可以使用assign方法
df1['B']=list('abc')
df1
AB
11a
22b
33c
df1.assign(C=pd.Series(list('def')))
ABC
11ae
22bf
33cNaN
但assign方法不会对原DataFrame做修改
df1
AB
11a
22b
33c
(g)根据类型选择列
df.select_dtypes(include=['number']).head()
col2col3
51.3
62.5
73.6
84.6
95.8
df.select_dtypes(include=['float']).head()
col3
1.3
2.5
3.6
4.6
5.8
(h)将Series转换为DataFrame
s = df.mean()
s.name='to_DataFrame'
s
col2    7.00
col3    3.56
Name: to_DataFrame, dtype: float64
s.to_frame()
to_DataFrame
col27.00
col33.56
使用T符号可以转置
s.to_frame().T
col2col3
to_DataFrame7.03.56

三、常用基本函数

从下面开始,包括后面所有章节,我们都会用到这份虚拟的数据集
df = pd.read_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\table.csv')

1. head和tail

df.head()
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
1S_1C_11102Fstreet_21927332.5B+
2S_1C_11103Mstreet_21868287.2B+
3S_1C_11104Fstreet_21678180.4B-
4S_1C_11105Fstreet_41596484.8B+
df.tail()
SchoolClassIDGenderAddressHeightWeightMathPhysics
30S_2C_42401Fstreet_21926245.3A
31S_2C_42402Mstreet_71668248.7B
32S_2C_42403Fstreet_61586059.7B+
33S_2C_42404Fstreet_21608467.7B
34S_2C_42405Fstreet_61935447.6B
可以指定n参数显示多少行
df.head(3)
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
1S_1C_11102Fstreet_21927332.5B+
2S_1C_11103Mstreet_21868287.2B+

2. unique和nunique

nunique显示有多少个唯一值
df['Physics'].nunique()
7
unique显示所有的唯一值
df['Physics'].unique()
array(['A+', 'B+', 'B-', 'A-', 'B', 'A', 'C'], dtype=object)

3. count和value_counts

count返回非缺失值元素个数
df['Physics'].count()
35
value_counts返回每个元素有多少个
df['Physics'].value_counts()
B+    9
B     8
B-    6
A     4
A+    3
A-    3
C     2
Name: Physics, dtype: int64

4. describe和info

info函数返回有哪些列、有多少非缺失值、每列的类型
df.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 35 entries, 0 to 34
Data columns (total 9 columns):
 #   Column   Non-Null Count  Dtype  
---  ------   --------------  -----  
 0   School   35 non-null     object 
 1   Class    35 non-null     object 
 2   ID       35 non-null     int64  
 3   Gender   35 non-null     object 
 4   Address  35 non-null     object 
 5   Height   35 non-null     int64  
 6   Weight   35 non-null     int64  
 7   Math     35 non-null     float64
 8   Physics  35 non-null     object 
dtypes: float64(1), int64(3), object(5)
memory usage: 2.6+ KB
describe默认统计数值型数据的各个统计量
df.describe()
IDHeightWeightMath
count35.0000035.00000035.00000035.000000
mean1803.00000174.14285774.65714361.351429
std536.8774113.54109812.89537719.915164
min1101.00000155.00000053.00000031.500000
25%1204.50000161.00000063.00000047.400000
50%2103.00000173.00000074.00000061.700000
75%2301.50000187.50000082.00000077.100000
max2405.00000195.000000100.00000097.000000
可以自行选择分位数
df.describe(percentiles=[.05, .25, .75, .95])
IDHeightWeightMath
count35.0000035.00000035.00000035.000000
mean1803.00000174.14285774.65714361.351429
std536.8774113.54109812.89537719.915164
min1101.00000155.00000053.00000031.500000
5%1102.70000157.00000056.10000032.640000
25%1204.50000161.00000063.00000047.400000
50%2103.00000173.00000074.00000061.700000
75%2301.50000187.50000082.00000077.100000
95%2403.30000193.30000097.60000090.040000
max2405.00000195.000000100.00000097.000000
对于非数值型也可以用describe函数
df['Physics'].describe()
count     35
unique     7
top       B+
freq       9
Name: Physics, dtype: object

5. idxmax和nlargest

idxmax函数返回最大值,在某些情况下特别适用,idxmin功能类似
df['Math'].idxmax()
5
nlargest函数返回前几个大的元素值,nsmallest功能类似
df['Math'].nlargest(3)
5     97.0
28    95.5
11    87.7
Name: Math, dtype: float64

6. clip和replace

clip和replace是两类替换函数
clip是对超过或者低于某些值的数进行截断
df['Math'].head()
0    34.0
1    32.5
2    87.2
3    80.4
4    84.8
Name: Math, dtype: float64
df['Math'].clip(33,80).head()
0    34.0
1    33.0
2    80.0
3    80.0
4    80.0
Name: Math, dtype: float64
df['Math'].mad()
16.924244897959188
replace是对某些值进行替换
df['Address'].head()
0    street_1
1    street_2
2    street_2
3    street_2
4    street_4
Name: Address, dtype: object
df['Address'].replace(['street_1','street_2'],['one','two']).head()
0         one
1         two
2         two
3         two
4    street_4
Name: Address, dtype: object
通过字典,可以直接在表中修改
df.replace({'Address':{'street_1':'one','street_2':'two'}}).head()
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mone1736334.0A+
1S_1C_11102Ftwo1927332.5B+
2S_1C_11103Mtwo1868287.2B+
3S_1C_11104Ftwo1678180.4B-
4S_1C_11105Fstreet_41596484.8B+

7. apply函数

apply是一个自由度很高的函数,在第3章我们还要提到
对于Series,它可以迭代每一列的值操作:
df['Math'].apply(lambda x:str(x)+'!').head() #可以使用lambda表达式,也可以使用函数
0    34.0!
1    32.5!
2    87.2!
3    80.4!
4    84.8!
Name: Math, dtype: object
对于DataFrame,它可以迭代每一个列操作:
df.apply(lambda x:x.apply(lambda x:str(x)+'!')).head() #这是一个稍显复杂的例子,有利于理解apply的功能
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1!C_1!1101!M!street_1!173!63!34.0!A+!
1S_1!C_1!1102!F!street_2!192!73!32.5!B+!
2S_1!C_1!1103!M!street_2!186!82!87.2!B+!
3S_1!C_1!1104!F!street_2!167!81!80.4!B-!
4S_1!C_1!1105!F!street_4!159!64!84.8!B+!

四、排序

1. 索引排序

df.set_index('Math').head() #set_index函数可以设置索引,将在下一章详细介绍
SchoolClassIDGenderAddressHeightWeightPhysics
Math
34.0S_1C_11101Mstreet_117363A+
32.5S_1C_11102Fstreet_219273B+
87.2S_1C_11103Mstreet_218682B+
80.4S_1C_11104Fstreet_216781B-
84.8S_1C_11105Fstreet_415964B+
df.set_index('Math').sort_index().head() #可以设置ascending参数,默认为升序,True
SchoolClassIDGenderAddressHeightWeightPhysics
Math
31.5S_1C_31301Mstreet_416168B+
32.5S_1C_11102Fstreet_219273B+
32.7S_2C_32302Mstreet_517188A
33.8S_1C_21204Fstreet_516263B
34.0S_1C_11101Mstreet_117363A+

2. 值排序

df.sort_values(by='Class').head()
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
19S_2C_12105Mstreet_41708134.2A
18S_2C_12104Fstreet_51599772.2B+
16S_2C_12102Fstreet_61616150.6B+
15S_2C_12101Mstreet_71748483.3C
多个值排序,即先对第一层排,在第一层相同的情况下对第二层排序
df.sort_values(by=['Address','Height']).head()
SchoolClassIDGenderAddressHeightWeightMathPhysics
0S_1C_11101Mstreet_11736334.0A+
11S_1C_31302Fstreet_11755787.7A-
23S_2C_22204Mstreet_11757447.2B-
33S_2C_42404Fstreet_21608467.7B
3S_1C_11104Fstreet_21678180.4B-

五、问题与练习

1. 问题

【问题一】 Series和DataFrame有哪些常见属性和方法?
【问题二】 value_counts会统计缺失值吗?
【问题三】 与idxmax和nlargest功能相反的是哪两组函数?
【问题四】 在常用函数一节中,由于一些函数的功能比较简单,因此没有列入,现在将它们列在下面,请分别说明它们的用途并尝试使用。
sum/mean/median/mad/min/max/abs/std/var/quantile/cummax/cumsum/cumprod
【问题五】 df.mean(axis=1)是什么意思?它与df.mean()的结果一样吗?第一问提到的函数也有axis参数吗?怎么使用?

【问题一】1.Series常见属性:值(values),索引(index),名字(name),类型(dtype)
常见方法:‘describe’,‘apply’,‘index’,‘values’…s.to_frame().T转置,s.to_frame()Series转换为DataFrame…

2.DataFrame常见属性:df.index,df.columns,df.values,df.shape
常见方法:df.rename修改行或列名,df.mean(),df.drop列的删除与df1.assign添加…
【问题二】不统计
【问题三】idmin 和 nsmallest
【问题四】quantile(分位数)/cummax(返回一个DataFrame或Series轴上的累积最大值)/cumsum/cumprod(返回包含累计产品的相同大小的DataFrame或Series)
【问题五】 详解链接
axis值的选择
解释:使用0值表示沿着每一列或行标签\索引值向下执行方法
使用1值表示沿着每一行或者列标签模向执行对应的方法

不一样,有,选择axis=(0或1)进行方法不同方向的执行

2. 练习

【练习一】 现有一份关于美剧《权力的游戏》剧本的数据集,请解决以下问题:
(a)在所有的数据中,一共出现了多少人物?
(b)以单元格计数(即简单把一个单元格视作一句),谁说了最多的话?
(c)以单词计数,谁说了最多的单词?
pd.read_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\Game_of_Thrones_Script.csv').head()
Release DateSeasonEpisodeEpisode TitleNameSentence
02011/4/17Season 1Episode 1Winter is Comingwaymar royceWhat do you expect? They're savages. One lot s...
12011/4/17Season 1Episode 1Winter is ComingwillI've never seen wildlings do a thing like this...
22011/4/17Season 1Episode 1Winter is Comingwaymar royceHow close did you get?
32011/4/17Season 1Episode 1Winter is ComingwillClose as any man would.
42011/4/17Season 1Episode 1Winter is CominggaredWe should head back to the wall.
#a
df=pd.read_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\Game_of_Thrones_Script.csv')
df['Name'].nunique()
564
#b
df['Name'].value_counts()
tyrion lannister      1760
jon snow              1133
daenerys targaryen    1048
cersei lannister      1005
jaime lannister        945
                      ... 
portan                   1
listeners                1
cooper                   1
slave owner              1
shouting                 1
Name: Name, Length: 564, dtype: int64

df['Name'].value_counts().index[0]
'tyrion lannister'
#c
。。。。。。。。。。。。。。
【练习二】现有一份关于科比的投篮数据集,请解决如下问题:
(a)哪种action_type和combined_shot_type的组合是最多的?
(b)在所有被记录的game_id中,遭遇到最多的opponent是一个支?
pd.read_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\Kobe_data.csv',index_col='shot_id').head()
#index_col的作用是将某一列作为行索引
action_typecombined_shot_typegame_event_idgame_idlatloc_xloc_ylonminutes_remainingperiod...shot_made_flagshot_typeshot_zone_areashot_zone_basicshot_zone_rangeteam_idteam_namegame_datematchupopponent
shot_id
1Jump ShotJump Shot102000001233.972316772-118.1028101...NaN2PT Field GoalRight Side(R)Mid-Range16-24 ft.1610612747Los Angeles Lakers2000/10/31LAL @ PORPOR
2Jump ShotJump Shot122000001234.0443-1570-118.4268101...0.02PT Field GoalLeft Side(L)Mid-Range8-16 ft.1610612747Los Angeles Lakers2000/10/31LAL @ PORPOR
3Jump ShotJump Shot352000001233.9093-101135-118.370871...1.02PT Field GoalLeft Side Center(LC)Mid-Range16-24 ft.1610612747Los Angeles Lakers2000/10/31LAL @ PORPOR
4Jump ShotJump Shot432000001233.8693138175-118.131861...0.02PT Field GoalRight Side Center(RC)Mid-Range16-24 ft.1610612747Los Angeles Lakers2000/10/31LAL @ PORPOR
5Driving Dunk ShotDunk1552000001234.044300-118.269862...1.02PT Field GoalCenter(C)Restricted AreaLess Than 8 ft.1610612747Los Angeles Lakers2000/10/31LAL @ PORPOR

5 rows × 24 columns

#a
df=pd.read_csv('D:\\86151\\桌面\\Datawhale\\pandas\\joyful-pandas-master\\data\\Kobe_data.csv',index_col='shot_id')
pd.Series(list(zip(df['action_type'],df['combined_shot_type']))).value_counts().index[0]
('Jump Shot', 'Jump Shot')
#b
df['opponent'].value_counts()
SAS    1978
PHX    1781
HOU    1666
SAC    1643
DEN    1642
POR    1539
UTA    1490
MIN    1474
GSW    1356
LAC    1285
DAL    1199
MEM    1030
BOS     946
SEA     828
IND     761
PHI     720
ORL     719
DET     715
OKC     677
TOR     664
NYK     657
MIA     627
CHA     620
CLE     619
CHI     610
WAS     600
MIL     586
NOH     581
NJN     520
ATL     519
NOP     344
VAN     246
BKN      55
Name: opponent, dtype: int64

df['opponent'].value_counts().index[0]
'SAS'
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值