前言
主要记录自己pandas处理数据遇到的一些困难,基础非常薄弱,希望能越来越熟练
Next:set_index与reindex的区别
问题描述
经常会遇到
- 更改
index
- 将某一个
column
的信息设置为index(例如股票数据处理中,经常会遇到某一个column
为日期) - 按照指定的
index
重新拍累dataframe
问题解决
pd.set_index
能够将DataFrame
中的某一column
设置为索引。如果传入的是column列表,则设置多层索引。pd.reindex
的作用是根据new_index
重新排列DataFrame
,且如果新的new_index
中含有原index未含有的索引,则会创建新的行,且对应的行的值全部是Nan
,当然,可以选择在reindex( )
传入method参数来解决这一点,例如:method='ffill'
注意,set_index, reindex, sort_index的区别
set_index
是将原本就存在的某一列或者某几列设置为索引,以构建索引(或者多层索引)reindex
是将原来的DataFrame按照现如今新给出的index
进行排序,可能会造成df数据的扩充,也可能会造成缺失值,需要进行处理sort_index
是不改变现有的index,只是将他们按照升序或者降序,重新排列数据,但如果数据不是升序或者降序,而是特殊的序列,则需要用reindex
进行排序了
Next: 读入DataFrame时的数据类型问题
1. 指定读取csv文件时的数据类型
问题描述
在通过pd.read_csv( )方法读入csv数据时,如果未指定data_type,那么该方法会按照默认设置读入数据,有时候会将string字符串形式保存的数字读成float或者int的数据类型。
例如,我的trade_date是以字符串形式保存的,但是读入的时候默认变成了整数形,从而导致我按照字符串的index来reindex时,整个DataFrame的数据全部变为了Nan
解决方法
在读入数据的时候,通过pd.read_csv( )
设置参数 dtype={'trade_date' : 'string'}
,就可以了;当然,如果要以数值的形式读入,设置dtype={'trade_date' : 'value'}
,更改之后效果如下:
2.读取csv文件时,指定作为index的列
设置index_col=column_name即可,当设置为0时,默认不读取任何一列作为index
pd.read_csv(index_col=column_name)
Next: 读写DataFrame时的参数问题
1. 写入DataFrame时
- header:这代表将DataFrame的第n行作为表头,设置为False代表无表头
df = pd.DataFrame()
df.to_csv(header=None or 0~len(index))
- index:设置为True时,python会自动创造一个index,再次读入的时候,则会出现一个名称为unnamed的column,此column就是之前创造的,设置为False时,则不会创造此index
注意
:如果之前读入DataFrame的时候,通过index_col=
设置了index,则再次存入的时候,不要设置index=False
,否则这会导致index的信息缺失!
- index_label:设置index的名称,可以用df.index.name进行访问,如果没有设置,则会出现unnamed:0的情况
Next: DataFrame的合并,pd.merge()
问题描述
当通过tushare两个不同的接口获得了股票数据,pro.daily_basic获得了一些技术指标信息,pro.daily获得了每日股价信息,这两个dataframe中有重复的column,想把他们合并成一个dataframe,但同时合并相同的列,保留不同的列
可以看到,二者是含有共同的column的,例如trade_date, ts_code。
问题解决
直接使用pd.merge(df1, df2)即可,因为on参数在默认的设置下,其会自动根据两个dataframe相同的列数(值也要相同)来进行合并,因此,上述的trade_date, ts_code, close就全部被合并了,合并后的columns如下
可以看到,相同的column已经合并了,不同的column也得以保留
Next: Pandas追加写入Excel数据
问题描述
通过Excel追加写入文件的时候,创建writer = pd.ExcelWriter(path, mode='a')
,但是却产生了如下报错:
ValueError: Append mode is note supported with xlsxwriter
问题解决
产生这样问题的主要原因是因为:现在已有的的写入excel模块包含openpyxl
和xlsxwriter
,pd.ExcelWriter
方法中默认的模块是xlsxwriter
,但此模块不支持append追加操作,因此我们只需要更改pd.ExcelWriter
方法中的默认模块即可:
# 写法1
with pd.ExcelWriter(path, mode='a', engine='openpyxl') as writer:
df1.to_excel(writer, sheet_name='this is the first')
df2.to_excel(writer, sheet_name='this is the second')
# 写法2
writer = pd.ExcelWriter(path, mode='a', engine='openpyxl')
df1.to_excel(wirter, sheet_name)
writer.save()
writer.close()
具体,可以参照这篇博文
Next:获取Pandas的行
问题描述
调取Pandas的某一行
问题解决
一般来说有三种解决方式
# 方法1:一个一个调用
df.loc[index, column]
# 方法2:iloc
df.iloc[index_num, column]
# 方法3:这样的方法可以调用DataFrame的行,但是不能够对列进行选择,因此默认是调用了所有的列
df[index_range]
注意:loc
和iloc
方法都可以批量调用,传入的是list, ndarray
都是可以的
df.loc[a_list, :]
df.loc[index_list, column_list]
Next:对DataFrame进行批量操作
问题描述
想对DataFrame的行进行批量数量操作
问题解决
如果操作都是 同质化 的话,那么可以直接通过loc,iloc
批量定位元素,然后统一进行操作
a = pd.DataFrame([[1,1,1],[1,1,1]], index=['a','b'], columns=['a','b'