pandas中DataFrame的修改元素值、缺失值处理、合并操作的⽅法
实验⽬的
熟练掌握pandas中DataFrame的修改元素值、缺失值处理、合并操作的⽅法
实验原理
concat合并:
keys=None, levels=None, names=None, verify_integrity=False)
参数:
objs: series,dataframe或者是panel构成的序列lsit。
axis: 需要合并链接的轴,0是⾏,1是列,默认为axis=0。
join:连接的⽅式 inner,或者outer,默认为join=‘outer’
keys:合并的同时增加分区。
ignore_index:忽略索引,默认为False,当为True时,合并的两表就按列字段对齐。
merge合并:
多表left joinpandas的merge⽅法提供了⼀种类似于SQL的内存链接操作,官⽹⽂档提到它的性能会⽐其他开源语⾔的数据操作(例如R)要⾼效。
<(left, right, 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)
merge的参数:
left/right:两个不同的DataFrame
on:指的是⽤于连接的列索引名称。必须存在右右两个DataFrame对象中,如果没有指定且其他参数也未指定则以两个DataFrame的列名交集做为连接键
left_on:左则DataFrame中⽤作连接键的列名;这个参数中左右列名不相同,但代表的含义相同时⾮常有⽤。right_on:右则DataFrame 中⽤作 连接键的列名。
left_index:使⽤左则DataFrame中的⾏索引做为连接键。
right_index:使⽤右则DataFrame中的⾏索引做为连接键。
how:指的是合并(连接)的⽅式有inner(内连接),left(左外连接),right(右外连接),outer(全外连接);默认为inner。
sort:根据DataFrame合并的keys按字典顺序排序,默认是True,如果置false可以提⾼表现。
suffixes:字符串值组成的元组,⽤于指定当左右DataFrame存在相同列名时在列名后⾯附加的后缀名称,默认为(’_x’,’_y’)
copy:默认为True,总是将数据复制到数据结构中;⼤多数情况下设置为False可以提⾼性能
indicator:在 0.17.0中还增加了⼀个显⽰合并数据中来源情况;如只来⾃于左边(left_only)、两者(both)。
merge的默认合并⽅法:merge⽤于表内部基于 index-on-index 和 index-on-column(s) 的合并,但默认是基于index来合并。
join连接:主要⽤于索引上的合并
join(self, other, on=None, how=‘left’, lsuffix=’’, rsuffix=’’,sort=False)
其中参数的意义与merge⽅法基本相同,只是join⽅法默认为左外连接how=left
1.默认按索引合并,可以合并相同或相似的索引,不管他们有没有重叠列。
2.可以连接多个DataFrame
3.可以连接除索引外的其他列
4.连接⽅式⽤参数how控制
5.通过lsuffix=’’, rsuffix=’’ 区分相同列名的列
实验环境
Python 3.6.1
Jupyter
实验内容
练习pandas中DataFrame的修改元素值、缺失值处理、合并操作。
代码部分:
import numpy as np
import pandas as pd
1.修改数据
1) 通过字典对象创建⼀个DataFrame。
dates = pd.date_range('20130101', periods=6)
dates
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))
df
A B C D
2013-01-010.896387-0.983990-0.6337150.224435
2013-01-020.173375-0.220575-1.0101740.494923
2013-01-030.5797140.303940 2.7906000.302989
2013-01-04-1.684962-0.788070-0.265911-0.907506
2013-01-05-0.108375-0.799685 2.212832 1.557938
2013-01-060.396521-0.0871390.056659 1.267565
2) .新建⼀个值为[1,2,3,4,5,6],索引index为2013-01-02到2013-01-07的Series,并将series赋值给df作为df新增的F列
s1=pd.Series([1,2,3,4,5,6],index=pd.date_range('20130102',periods=6))
s1
2013-01-02 1
2013-01-03 2
2013-01-04 3
2013-01-05 4
2013-01-06 5
2013-01-07 6
Freq: D, dtype: int64
df['F']=s1
df
A B C D F
2013-01-010.896387-0.983990-0.6337150.224435NaN 2013-01-020.173375-0.220575-1.0101740.494923 1.0 2013-01-030.5797140.303940 2.7906000.302989 2.0 2013-01-04-1.684962-0.788070-0.265911-0.907506 3.0 2013-01-05-0.108375-0.799685 2.212832 1.557938 4.0
2013-01-060.396521-0.0871390.056659 1.267565 5.0
A B C D F
3) 通过at⽅法把满⾜df中dates[0],列A的值修改为0
df.at[dates[0],'A']=0
df
A B C D F
2013-01-010.000000-0.983990-0.6337150.224435NaN 2013-01-020.173375-0.220575-1.0101740.494923 1.0 2013-01-030.5797140.303940 2.7906000.302989 2.0 2013-01-04-1.684962-0.788070-0.265911-0.907506 3.0 2013-01-05-0.108375-0.799685 2.212832 1.557938 4.0 2013-01-060.396521-0.0871390.056659 1.267565 5.0 4) 使⽤iat⽅法修改df中⾏下标为0,列下标为1的值等于0
df.iat[0,1]=0
df
A B C D F
2013-01-010.0000000.000000-0.6337150.224435NaN 2013-01-020.173375-0.220575-1.0101740.494923 1.0 2013-01-030.5797140.303940 2.7906000.302989 2.0 2013-01-04-1.684962-0.788070-0.265911-0.907506 3.0 2013-01-05-0.108375-0.799685 2.212832 1.557938 4.0 2013-01-060.396521-0.0871390.056659 1.267565 5.0 5) 使⽤loc⽅法把df的D列值修改为5*len(df)
df.loc[:,'D']=np.array([5]*len(df))
df
A B C D F
2013-01-010.0000000.000000-0.6337155NaN 2013-01-020.173375-0.220575-1.0101745 1.0 2013-01-030.5797140.303940 2.7906005 2.0 2013-01-04-1.684962-0.788070-0.2659115 3.0 2013-01-05-0.108375-0.799685 2.2128325 4.0 2013-01-060.396521-0.0871390.0566595 5.0 6) 使⽤copy⽅法将df赋值给df2,使⽤where语句将df2中满⾜df2>0条件的值修改为-df2。
py()
df2
A B C D F
2013-01-010.0000000.000000-0.6337155NaN
A B C D F
2013-01-020.173375-0.220575-1.0101745 1.0
2013-01-030.5797140.303940 2.7906005 2.0
2013-01-04-1.684962-0.788070-0.2659115 3.0
2013-01-05-0.108375-0.799685 2.2128325 4.0
2013-01-060.396521-0.0871390.0566595 5.0
df2[df2>0]=-df2
df2
A B C D F
2013-01-010.0000000.000000-0.633715-5NaN
2013-01-02-0.173375-0.220575-1.010174-5-1.0
2013-01-03-0.579714-0.303940-2.790600-5-2.0
2013-01-04-1.684962-0.788070-0.265911-5-3.0
2013-01-05-0.108375-0.799685-2.212832-5-4.0
2013-01-06-0.396521-0.087139-0.056659-5-5.0 2.缺失值
1)使⽤reindex⽅法将df的⾏列索引同时重新索引,使⾏index=date[0:4],列索引culumns=lumns+ [‘E’]),并返回⼀个新的数据帧df1,然后使⽤loc⽅法将df1中⾏索引为dates[0]和dates[1],列为“E"的值修改为1。
index(index=dates[0:4],columns=lumns)+['E'])
df1
A B C D F E
2013-01-010.0000000.000000-0.6337155NaN NaN 2013-01-020.173375-0.220575-1.0101745 1.0NaN 2013-01-030.5797140.303940 2.7906005 2.0NaN 2013-01-04-1.684962-0.788070-0.2659115 3.0NaN
df1.loc[dates[0]:dates[1],'E']=1
df1
A B C D F E
2013-01-010.0000000.000000-0.6337155NaN 1.0 2013-01-020.173375-0.220575-1.0101745 1.0 1.0 2013-01-030.5797140.303940 2.7906005 2.0NaN 2013-01-04-1.684962-0.788070-0.2659115 3.0NaN 2) 使⽤dropna⽅法删除df1中任何包含缺失值的⾏。
df1.dropna(how='any')
A B C D F E
2013-01-020.173375-0.220575-1.0101745 1.0 1.0
3) 使⽤fillna⽅法,将df1中所有的缺失值⽤5填充
df1
A B C D F E
2013-01-010.0000000.000000-0.6337155NaN 1.0 2013-01-020.173375-0.220575-1.0101745 1.0 1.0 2013-01-030.5797140.303940 2.7906005 2.0NaN 2013-01-04-1.684962-0.788070-0.2659115 3.0NaN df1.fillna(value=5)
A B C D F E
2013-01-010.0000000.000000-0.6337155 5.0 1.0 2013-01-020.173375-0.220575-1.0101745 1.0 1.0 2013-01-030.5797140.303940 2.7906005 2.0 5.0 2013-01-04-1.684962-0.788070-0.2659115 3.0 5.0 4) 使⽤isnull⽅法判断df1中的值是否为缺失值,是缺失值返回True,否则返回False,返回⼀个由布尔值组成的数据帧
pd.isnull(df1)
A B C D F E
2013-01-01False False False False True False
2013-01-02False False False False False False
2013-01-03False False False False False True
2013-01-04False False False False False True 5) 使⽤notnull判断df1中的值是否为缺失值,返回⼀个由布尔值组成的数据帧
A B C D F E
2013-01-01True True True True False True
2013-01-02True True True True True True
2013-01-03True True True True True False
2013-01-04True True True True True False
3.合并
1)使⽤concat进⾏合并
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论