pandas复习(2)
( 记录一下平时遇到的一些数据处理的问题复习自用orz)
1.读取数据
pickle文件,可以将python中的数据类型进行序列化
compression参数指定了压缩类型,‘zip’, ‘gzip’, ‘bz2’, ‘zstd’
pandas.read_pickle(filepath_or_buffer, compression='infer', storage_options=None)
2.处理数据
(1)取特定的行列
利用标签取列:
data['xxx']
data.at #访问单个值
data.loc['行名','列名'] #访问值组
data.loc[['A行','B行']] # 取多行
(2)对需要的行列进行处理
时间处理
#转换回日期格式,默认是毫秒
data['time'] = pd.to_datetime(data['time'],unit='s')
#生成一个时间戳
now = pd.Timestamp.now()
某一列数据进行处理
data['xxx'] = ['这里用一个列表表达式']
data['xxx'] = data['xxx'].apply(lamdba x: function(x))
对于字符串的处理
#去掉首位的a
data['a'] = data['a'].str.strip('a')
# 替换
data['a'] = data['a'].str.replace('a','b')
将特定的列拆分后合并
data = pd.concat([data, data['tempvaluearray'].str.split(',', expand=True)], axis=1).drop('tempvaluearray', axis=1)
pd.concat()#可以按照指定的轴将dataframe或者series拼接,而merge只能拼接两个表
axis #0:上下拼接 1:左右拼接
#drop()的参数axis在删除特定的一行为1
批量修改列名称
data.rename(columns=dic)#可以写一个字典进行替换
计算时保留小数
'%.3f'%0.0065 #保留3位小数
lambda x:'%.3f'%((int(x)-1000)/1000))
调整列顺序
#先取出来再插入
A = data['A']
data.drop(labels=['A'],axis = 1,inplace=True)
data.insert(0, 'A', A)
一个字符串划分的函数
# 对于数据为[12,23,45,12]类似的数据,其中不能是字符串
def split_col(data, columns):
"""拆分成列
:param data: 原始数据
:param columns: 拆分的列名
:type data: pandas.core.frame.DataFrame
:type columns: list
"""
for c in columns:
new_col = data.pop(c)
max_len = max(list(map(len, new_col.values))) # 最大长度
new_col = new_col.apply(lambda x: x + [None]*(max_len - len(x))) # 补空值,None可换成np.nan
new_col = np.array(new_col.tolist()).T # 转置
for i, j in enumerate(new_col):
data[c + str(i)] = j