pandas是数据科学中常用的Python包。
pandas官网:pandas - Python Data Analysis Library
pandas文档官网:pandas documentation — pandas 1.4.2 documentation
文章目录
1. 安装
如果使用anaconda作为Python虚拟环境管理工具,则其base环境中会直接默认安装pandas包,这也是pandas官网getting started页面中介绍的方法:pandas - Python Data Analysis Library
anaconda的安装和使用此处不再赘述。
如果不是anaconda的base环境,则可以参考pandas文档中安装部分的介绍来进行安装:Installation — pandas 1.4.2 documentation
pandas官方支持Python3.8, 3.9和3.10版本。
直接在虚拟环境中用conda安装即可:conda install pandas
2. 导入导出
2.1 xlsx后缀的Excel文件
导入:data=pd.read_excel('file.xlsx')
https://pandas.pydata.org/docs/reference/api/pandas.read_excel.html
入参:
- 文件名
- sheet_name: str, int, list, or None, default 0
- skiprows=[1,2]:跳过索引为1、2的行
2.2 SQL
导出:
DataFrame.to_sql(name, con, schema=None, if_exists='fail', index=True, index_label=None, chunksize=None, dtype=None, method=None)
入参:
- if_exists:如果表已经存在,将如何处理新的数据
fail
append
:添加到尾部
2.3 CSV文件
导入:
train = pd.read_csv(文件路径)
入参:
- nrows:只传入几行数据
3. 处理pd.DataFrame格式的对象
3.0 属性
colomns
:列名empty
:布尔值
3.1 新建表格
3.2 合并表格
- 两个表格列相同,直接把一个表格的元素完全添加到另一个后面,并直接重置索引:
table3=pd.concat([table1,table2],ignore_index=True)
3.3 取出数据
3.3.1 按列取
- 按照列名组成的列表来取出对应列:
table2=table1[['col1','col2','col3']]
3.3.2 按行取
df.loc[1]
df.iloc[1]
3.3.3 按行列坐标取
dataframe.loc[1, 'c']
dataframe.iloc[1, 3]
一次取多条:data1[114:116][['preclose','close']]
3.3.4 按条件取
- 删除DataFrame中
col1
一列中元素满足条件的行- 直接用匿名函数实现,如条件是含有英文字母(实现效果是保留没有英文字母的行):
table2=table1[table1['col1'].apply(lambda x:not bool(re.search('[a-zA-Z]',x)))]
- 直接用匿名函数实现,如条件是含有英文字母(实现效果是保留没有英文字母的行):
3.4 查看与分析数据
- 查看描述性信息:
table1.info()
输出示例:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 9959 entries, 0 to 9958
Data columns (total 25 columns):
# Column Non-Null Count Dtype
--- ------ -------------- -----
0 days_act 9959 non-null int64
1 days_plan 9959 non-null int64
2 profit_pero 9959 non-null int64
3 sales_pred 9959 non-null int64
4 sales_perc 9959 non-null int64
5 shipment 9959 non-null object
6 records 9959 non-null int64
7 profit_rate 9959 non-null float64
8 product_name 9959 non-null object
9 profit 9959 non-null int64
10 shipment_date 9959 non-null datetime64[ns]
11 country 9959 non-null object
12 region 9959 non-null object
13 city 9959 non-null object
14 sub_category 9959 non-null object
15 customer_name 9959 non-null object
16 discount 9959 non-null float64
17 num 9959 non-null int64
18 province 9959 non-null object
19 category 9959 non-null object
...
23 post_method 9959 non-null object
24 sales_act 9959 non-null int64
dtypes: datetime64[ns](2), float64(2), int64(9), object(12)
memory usage: 1.9+ MB
- 查看前面几行:
table1.head()
(默认打印5行) - 查看最后几行:
table1.tail()
(默认打印5行) - 查看某一列有多少种取值:
table1['col1'].nunique()
- 查看某一列的所有取值:
table1['col1'].unique()
- 查看某一列所有取值与对应数目:
table1['col1'].value_counts()
(默认降序排列) - 查看某一列的缺失值总数:
table1['col1'].isna().sum()
df.rolling(window, min_periods=None, center=False, win_type=None, on=None, axis=<no_default>, closed=None, step=None, method='single')
3.5 缺失值填充
- 直接将title列的缺失值(
None
)置为空字符串:train['title'] = train['title'].fillna('')
df.dropna(*, axis=0, how=<no_default>, thresh=<no_default>, subset=None, inplace=False, ignore_index=False)
删除含有缺失值的行或列
3.6 删除
按列删除:df.drop(['col1','col2','col3'],axis=1,inplace=True)
inplace设置是否要在原变量上直接做修改
3.7 内置处理函数
df.mean()
3.8 其他
- 重置索引,且不保留原始索引:
table2=table1.reset_index(drop=True)
- 检测某一个应该是str格式的元素是否是空值:
isinstance(factor,str) or not np.isnan(factor)
- 转换数据格式
DataFrame.astype(dtype, copy=None, errors='raise')
pandas.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=False, format=None, exact=_NoDefault.no_default, unit=None, infer_datetime_format=_NoDefault.no_default, origin='unix', cache=True)
4. 处理pd.Series格式的对象
类似dict的键值对格式
索引:index
值:value
0. 属性
empty
:布尔值
1. 创建
- DataFrame列实际上就是Series,所以经常对DataFrame列进行操作之后,返回值就是Series
比如:data['shipment_date']-data['order_date']
2. 修改
map(arg, na_action=None)
:对元素值进行批量处理
3. 查看与分析数据
- 求和:
sum()
- 最大值:
max()
- 最小值:
min()
- 不重复值(返回
np.array
):unique()
- 不重复值和对应出现次数:
value_counts()
5. pandas类函数
to_numeric(arg, errors='raise', downcast=None, dtype_backend=_NoDefault.no_default)
将arg转换为数值类型- arg:可以是pd.Series对象
pivot_table(df, index=['Manager', 'Rep'], values=['Price'], aggfunc=np.sum)
参考教程:使用Pandas 玩转透视表(pivot_table)pd.notnull(obj)
或pd.notna(obj)
6. 常见bug和警告
- 没有安装openpyxl,需要自己安。安完之后再重新运行代码,还是会报这个警告(在运行
read_excel()
时报警告):
但是据我观察不影响后续程序运行,所以我也不管了。
7. 用modin加速
安装:pip install "modin[all]"
使用时直接替换pandas导入代码就可以:import modin.pandas as pd
官方GitHub项目:https://github.com/modin-project/modin
8. 本文撰写过程中参考的网络资料
- pandas中DataFrame 数据合并,连接(merge,join,concat)_dataframe merge on index_Paulzhao6518的博客-CSDN博客
- Python中布尔值Bool的取反问题 - 知乎
- 详解 Pandas 与 Lambda 结合进行高效数据分析_AI科技大本营的博客-CSDN博客
- python3 判断字符串是否包含中英文和数字_Saggitarxm的博客-CSDN博客
- pandas重置DataFrame或Series的索引index_series 去除index_不论如何未来很美好的博客-CSDN博客
- pandas中对nan空值的判断和陷阱_pandas nan判断_S_o_l_o_n的博客-CSDN博客