Pandas DataFrame 使用技巧

Pandas是一个强大的分析结构化数据的工具集;它的使用基础是Numpy(提供高性能的矩阵运算);用于数据挖掘和数据分析,同时也提供数据清洗功能。Pandas是Python的核心数据分析支持库,提供了快速、灵活、明确的数据结构,旨在简单、直观地处理关系型、标记型数据。Pandas的目标是成为 Python数据分析实践与实战的必备高级工具,其长远目标是成为最强大、最灵活、可以支持任何语言的开源数据分析工具。经过多年不懈的努力,Pandas离这个目标已经越来越近了。

接下来是在使用Pandas处理数据时的一些小技巧,也许能在日常工作数据处理中帮助提高效率:

首先创建一个DataFrame:

import pandas as pd
df = pd.DataFrame([{'a':1, 'b':2, 'c':3}]).T.reset_index()
df.columns = ['label','value']
df

在这里插入图片描述

1 添加进度条(tqdm)

from tqdm import tqdm
tqdm.pandas(desc="Process Bar")
df['pair'] = df.progress_apply(lambda x: (x['label'],x['value']), axis=1)
df

在这里插入图片描述
tqdm在其他循环体中也可以展示进度,以下是一个简单例子:

for i in tqdm(range(5)):
    print(i)

在这里插入图片描述
在notebook中也可以使用专用的tqdm,进度条效果更美观些:

from tqdm.notebook import tqdm
tqdm.pandas(desc="Process Bar")
df['pair'] = df.progress_apply(lambda x: (x['label'],x['value']), axis=1)
df

在这里插入图片描述

2 一列拓展多列

df[['label_2','_value_2']] = df.apply(lambda x: x['pair'], axis=1, result_type='expand')
df

虽然pd.DataFrame和pd.Series两种数据结构在apply方法的使用上很相似,但是axisresult_type这些参数仅适用于pd.DataFrame。
在这里插入图片描述

3 dask并行计算

import dask.dataframe as dd
from dask.diagnostics import ProgressBar
ddf = df.copy()

with ProgressBar():  # 添加进度条
    ddf[['label_3','_value_3']] = dd.from_pandas(ddf, npartitions=8).map_partitions(lambda df: \
        df.apply(lambda x: x['pair'], axis=1, result_type="expand"), meta={0:'str',1:'f8'}).compute()
ddf

在这里插入图片描述
dask能够使pandas的DataFrame批量进行计算时采用多内核并行计算,充分利用CPU资源以提高运行速度。
① ProgressBar可为计算提供进度条。
npartitions为并行计算线程数,一般为计算机核心数。
③ 用dask的apply函数并设置result_type="expand"时,需要一个meta字典,用于明确每个列的数据类型,例如str, int或者 f8

4 保存CSV乱码问题

在这里插入图片描述
当我们想要将DataFrame保存成csv文件时,如果其中有中文那么经常会发现打开后乱码。例如上面这个DataFrame,我们用df.to_csv('data.csv')进行文件保存,打开后发现变成了这样:
在这里插入图片描述
保存文件时通过增加encoding='utf_8_sig'指定编码格式,即可轻松解决这个问题。

df.to_csv('data.csv', encoding='utf_8_sig')

在这里插入图片描述

5 保存多个数据表到单个Excel文件的不同sheet

with pd.ExcelWriter('data.xlsx') as writer:
    df1.to_excel(writer, sheet_name='df1', index=False)
    df2.to_excel(writer, sheet_name='df2', index=False)

6 多列优先级升降排序

df.sort_values(by=['a','b','c'], ascending=[False,True,True])

7 Python忽略警告

import warnings
warnings.filterwarnings("ignore")

8 以指定列为index的一维插值

df = pd.DataFrame([{'a': 0, 'b': 5},{'a': 4, 'b': 9}])
res = pd.DataFrame()
res['a'] = list(range(5))
res = pd.merge(res,df,on='a',how='outer').sort_values('a').set_index('a').interpolate(method='index').reset_index()
res

在这里插入图片描述

9 二维插值

from scipy.interpolate import RBFInterpolator, griddata, interp2d
# RBFInterpolator (首选)
points = [[800,4],[800,5],[1100,4],[1100,5]]
values = [318.2,454.5,411.9,564.4]
xi = [1000,4.5]
RBFInterpolator(points, values, kernel='cubic')([[1000,4.5]])[0]
# griddata
points = [[800,4],[800,5],[1100,4],[1100,5]]
values = [318.2,454.5,411.9,564.4]
xi = [1000,4.5]
griddata(points, values, xi, method='linear')[0]
# interp2d (即将废弃)
x = [800, 800 ,1100, 1100]
y = [4, 5, 4, 5]
z = [318.2,454.5,411.9,564.4]
interp2d(x, y, z, kind='linear')(1000,4.5)[0]

在这里插入图片描述
接下来是一个在DataFrame中二维插值的简单例子:
①首先构建一个以xy为坐标的DataFrame:

df = pd.DataFrame()
x = [2, 4, 6]
y = [3, 6, 9]
df[['x','y']] = [(x,y) for x in [2, 4, 6] for y in [3, 6, 9]]
df['z1'] = df['x'] + df['y']
df['z2'] = df['x'] - df['y']
df

在这里插入图片描述
②对DataFrame在xy的更细颗粒度上进行插值:

from scipy.interpolate import RBFInterpolator
points = list(zip(df['x'],df['y']))
values = df[['z1','z2']]
f = RBFInterpolator(points, values, kernel='cubic')
res = pd.DataFrame()
target_points = [(x,y) for x in range(2,7) for y in range(2,10,2)]
res[['x','y']] = target_points
res[['z1','z2']] = f(target_points)
res

在这里插入图片描述

10 matplotlib不能正确显示中文的解决方法

import matplotlib.pyplot as plt
plt.rcParams["font.sans-serif"]=["Simhei"]  # 设置默认字体
plt.rcParams["axes.unicode_minus"]=False  # 坐标轴正确显示正负号
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值