三、python中pandas_numpy_数据处理、合并与分组

三、数据处理、合并与分组


import pandas as pd
import numpy as np

df = pd.read_excel('/home/mw/input/pandas1206855/pandas120.xlsx')
df.head()

三、python中pandas_numpy_数据处理、合并与分组
补充缺失值
import random
df['value'] = [random.randint(1,100) for i in range(len(df))]
df.loc[[2,10,45,87], 'value'] = np.nan

1. 缺失值处理

1.1 判断缺失值

df.isnull().values.any()

True

df.isnull().sum()

createTime 0
education 0
salary 0
value 4
dtype: int64


df.notnull().sum()
df.shape[0] - df.isnull().sum()

1.2 缺失值填充


df['value'] = df['value'].fillna(df['value'].interpolate())
df.head()


df.fillna(value =1.0, inplace = True)

1.3 更改缺失值


df.loc[9:12,'value'] = np.nan

df.loc[:2] = np.nan

1.4 删除缺失值


df.dropna(axis=0, how='any', inplace=True)

df.dropna()

df.dropna(axis='columns')
df.dropna(axis=1)

df.dropna(how='all')

df.dropna(thresh=2)

df.dropna(subset=['education', 'value'])

df.dropna(inplace=True)

df.value.dropna()

2. 数据去重


df.drop_duplicates(['createTime'])

3. 添加/删除数据

3.1 添加一行数据[‘2020-03-16 10:48:36’, ‘硕士’, ’20k-40k’, ‘43.0’]


df2 = pd.DataFrame({
    'createTime':['2020-03-16 10:48:36'],
    'education':['硕士'],
    'salary':['20k-40k'],
    'value':[43.0]
})
df = df.append(df2, ignore_index=True)
df.tail()

三、python中pandas_numpy_数据处理、合并与分组

df.loc[len(df)] = ['2020-03-16 11:20:41', '硕士', '25k-45k', 29.0]
df.tail()

3.2 删除最后两行数据

df.drop(index=[len(df)-1,len(df)-2], inplace=True)

4. 数据排序


df.sort_values(by=['value'], ascending=True)

5. 数据类型转换


df['value2'] = [random.uniform(0.01, 1) for i in range(len(df))]

df['value2'].round(2)

df['value2'].map(lambda x : ('%.2f') % x)

df['value2'] = df['value2'].map(lambda x : format(x, '.2f'))
df.head()

5.2 将value2列小数转换为百分数


df['value2'] = df['value2'].astype('float')

df.style.format({'value2' : '{0:.2%}'.format})

df['value2'] = df['value2'].map(lambda x : format(x, '.2%'))
df.head()

5.3 将value2列数据转换为浮点类型


df['value2'].str.strip('%').astype('float')

5.4 Series类型转list


df['value'].tolist()[:10]

5.5 将时间戳类型转换为datatime类型

注:采用Timestamp.to_pydatetime()函数将给定的时间戳转换为本地python datetime对象; strftime()用来格式化datetime 对象


for i in range(len(df)):
    df.iloc[i,0] = df.iloc[i,0].to_pydatetime().strftime("%m-%d")
df.head()

6. 数据拆分

6.1 将salary列按照’-‘拆分

df['salary'].str.split('-')

6.2 删除salary列开头和结尾的任何字符,默认为空格

df['salary'].str.strip()

7. 将value列数据开根号


df[['value']].apply(np.sqrt)

import math
pd.DataFrame(df['value'].map(lambda x : math.sqrt(x)))

8. 数据合并:concat, merge, append, join


data1 = {"course":['Python', 'C', 'Java', 'R', 'SQL'],
       "grade":[6, 2, 6, 4, 5],
       "cycle":[4, 2, 6, 2, 1]}
data2 = {'course':['Python', 'C', 'PHP', 'R', 'SQL'],
         "grade":[6, 2, 6, 4, 5],
        'count':[30, 25, 14, 20, 29]}
df = pd.DataFrame(data1)
df1 = pd.DataFrame(data2)

8.1 DataFrame.concat()

语法:
concat(objs, axis=0, join=’outer’, join_axes=None, ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)
参数:
objs: series,dataframe或者是panel构成的序列lsit
axis:需要合并链接的轴,0是行,1是列
join:连接的方式 inner,或者outer
只是单纯的把两个表拼接在一起, 参数axis是关键,它用于指定合并的轴是行还是列,axis默认是0。


pd.concat([df[:1], df[-2:-1]])

list_ = [random.randint(1, 100) for i in range(len(df))]
df2 = pd.DataFrame(list_, columns=['value'])
pd.concat([df,df2], axis=1)

三、python中pandas_numpy_数据处理、合并与分组

8.2 DataFrame.merge()

df = pd.merge(left, right, how = “inner”,on = “None”)
参数:
left: 左表。也就是第一个df。
right:右表。也就是第二个df。
how: 和concat里面的”join”类似,表示”如何合并两表。
1)left: 只使用左表的键。
2)right:只使用右表的键。
3)inner: 使用左右表键的交集。
4)outer:使用左右表键的并集。
on: 表示按照哪一个键来进行合并。
类似于关系型数据库的连接方式,可以根据一个或多个键将不同的DatFrame连接起来。该函数的典型应用场景是,针对同一个主键存在两张不同字段的表,根据主键整合到一张表里面。


pd.merge(df, df1, on='course')

三、python中pandas_numpy_数据处理、合并与分组

pd.merge(df, df1, how='left', on=['course', 'grade'])

三、python中pandas_numpy_数据处理、合并与分组

pd.merge(df, df1, how='outer', on='course')

三、python中pandas_numpy_数据处理、合并与分组

8.3 DataFrame.append()

语法:
DataFrame.append(other,ignore_index=False, verify_integrity=False, sort=None)
参数:
other: DataFrame、series、dict、list这样的数据结构
ignore_index:默认值为False,如果为True则不使用index标签
verify_integrity :默认值为False,如果为True当创建相同的index时会抛出ValueError的异常o sort: boolean,默认是None,该属性在pandas的0.23.0的版本才存在。
功能说明:
向dataframe对象中添加新的行,如果添加的列名不在dataframe对象中,将会被当作新的列进行添加


df.append(df.iloc[2])

8.4 DataFrame.join()

语法:
DataFrame.join(other, on=None, how=’left’, lsuffix=”, rsuffix=”, sort=False)
参数:
other:【DataFrame,或者带有名字的Series,或者DataFrame的list】如果传递的是Series,那么其name属性应当是一个集合,并且该集合将会作为结果DataFrame的列名
on:【列名称,或者列名称的list/tuple,或者类似形状的数组】连接的列,默认使用索引连接
how:【{‘left’, ‘right’, ‘outer’, ‘inner’}, default:’left’】连接的方式,默认为左连接
lsuffix:【string】左DataFrame中重复列的后缀
rsuffix:【string】右DataFrame中重复列的后缀
sort:【boolean, default:False】按照字典顺序对结果在连接键上排序。如果为False,连接键的顺序取决于连接类型(关键字)。
主要用于索引上的合并,其参数的意义与merge方法中的参数意义基本一样。该方法最为简单,主要用于索引上的合并

df.join(df1, lsuffix='_left', rsuffix='_right')

8.5 总结

join 最简单,主要用于基于索引的横向合并拼接
merge 最常用,主要用于基于指定列的横向合并拼接
concat最强大,可用于横向和纵向合并拼接
append,主要用于纵向追加

9. 常见统计函数

print('grade列均值:',df['grade'].mean())
print('全体平均数:',df.mean().mean())
print('grade列中位数:',df['grade'].median())
print('grade列方差:',df['grade'].var())
print('grade列标准差:',df['grade'].std())
print('grade列最大值:',df['grade'].max())
print('grade列最小值:',df['grade'].min())

10. diff()函数:计算上下行差值


df['grade'].diff()

diff = df['grade'] - df['grade'].shift(1)
diff

11. pct_change()函数:计算上下行变化率


df['grade'].pct_change()

df['grade']/df['grade'].shift(1) - 1

12. shift()函数:将数据往后(前)移动x天

df['grade'].shift(2)
df['grade'].shift(-2)

13. rolling()函数:以2个数据作为滑动窗口,取均值/总和

df['grade'].rolling(2).mean()
df['grade'].rolling(2).sum()

14. expanding()函数

DataFrame.expanding(min_periods = 1,center = False,axis = 0)
rolling()函数,是固定窗口大小,进行滑动计算;
expanding()函数只设置最小的观测值数量,不固定窗口大小,实现累计计算,即不断扩展;


df['grade'].expanding(min_periods = 1).mean()

15. agg()函数

聚合函数,对分组后数据进行聚合,默认情况对分组后其他列进行聚合;

15.1 同时对grade, cycle两列进行计算总和、均值、中位数、最小/大值,标准差、方差


df[['grade', 'cycle']].agg([np.sum, np.mean, np.median, np.min, np.max, np.std, np.var])

df[['grade', 'cycle']].agg(['sum', 'mean', 'median', 'min', 'max', 'std', 'var'])

15.2 对grade列求平均,对cycle列求和


grade_mean = df['grade'].mean()
cycle_sum = df['cycle'].sum()
grade_mean, cycle_sum

df.agg({'grade' : np.mean, 'cycle' : np.sum})

16. 分组计算

主要的作用是进行数据的分组以及分组后地组内运算;

16.1 根据course列元素分组后计算平均值/中位数

df.groupby('course').mean()
df.groupby('course').median()

16.2 按course列分组后,grade列元素最多的是?


df[['course', 'grade']].groupby('course').sum().sort_values(by='grade', ascending=False).head(1)

pd.DataFrame(df[['course', 'grade']].groupby('course').sum().sort_values(by='grade', ascending=False).iloc[0,:])

df[['course', 'grade']].groupby('course').agg({'grade':'sum'}).sort_values(by='grade', ascending=False).head(1)

17. query()函数:使用布尔表达式查询帧的列

语法:
df.query(expr,inplace = False,** kwargs)
参数:
expr:str要评估的查询字符串。你可以在环境中引用变量,在它们前面添加一个’@’字符 。@a + b
inplace=False:是否修改数据或返回副本
kwargs:dict关键字参数

df = pd.read_excel('/home/mw/input/pandas1206855/pandas120.xlsx')
df['value'] = [random.randint(1, 100) for i in range(len(df))]
df.head()

17.1 计算三月份(‘month ==3’)的平均值

f['year'] = df['createTime'].apply(lambda x: x.year)
df['month'] = df['createTime'].apply(lambda x: x.month)
df['day'] = df['createTime'].apply(lambda x: x.day)
january_df = df.query('month==3')
january_df.mean()

三、python中pandas_numpy_数据处理、合并与分组
df.query('month == 3 and day == 16')

三、python中pandas_numpy_数据处理、合并与分组
df.query('day == 16')

Original: https://blog.csdn.net/Hexiaolian123/article/details/122629451
Author: 酸菜鱼摆摆
Title: 三、python中pandas_numpy_数据处理、合并与分组

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/756929/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • conda使用详细

    〇、Anaconda环境变量 一、常用命令 1、创建Python虚拟环境 2、切换环境 3、对虚拟环境中安装额外的包 4、关闭虚拟环境(即从当前环境退出返回使用PATH环境中的默认…

    Python 2023年9月9日
    062
  • 排序算法python版(3)-插入排序算法

    推荐文章 很多小伙伴都发现了,用户自主「申请上首页」的按钮取消了,那博主们写的文章还有上首页曝光的机会吗?我们的回答是”当然有!!!”虽然我们取消了上首页申…

    Python 2023年5月24日
    069
  • matplotlib.widgets简单上手

    matplotlib官方文档网站:https://matplotlib.org/我的思想是在案例中学习而不是挨着一个一个看,在案例中学习能很快掌握,并且能不断保持学习的热情,下面开…

    Python 2023年8月31日
    047
  • Ubuntu系统conda远程连接不初始化base环境的解决方法

    系统配置 Ubuntu 20.04 通过conda自动修复启动脚本 问题:ssh连接后,执行conda指令,提示没有该指令 进入conda根目录下的bin目录后,执行以下指令 ./…

    Python 2023年9月8日
    045
  • 我用Python放了除夕烟花

    uu们,有多久没放烟花了?今年你所在的地方允许放烟花么?既然我们不能线下放,那么我们就在线上放个够吧,先上最后效果图,给大家留个小疑问,知道博主配的什么歌么? 老规矩,先导包,导入…

    Python 2023年9月19日
    032
  • python 点云 坐标转换_python读取三维点云球坐标数据并动态生成三维图像与着色…

    啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

    Python 2023年9月6日
    039
  • 第5章 数据清理

    目录 5.1 数据清理的概述 5.1.1 常见的三种数据问题 5.1.2 常见三种数据问题的处理办法 5.2 缺失值的检测与处理 5.2.1 缺失值的检测 5.2.2 缺失值的处理…

    Python 2023年8月17日
    057
  • flask初始化一个项目

    安装flask pip install flask 项目目录 一个简单的目录结构,app目录下放置应用相关文件,server目录下放置关于配置的一些文件,使用的数据库是sqlite…

    Python 2023年8月14日
    066
  • python matplotlib

    准备: import matplotlib.pyplot as plt from mpl_toolkits.mplot3d import Axes3D fig = plt.figu…

    Python 2023年9月5日
    046
  • pandas获取对应的行或者列

    通过标签或布尔数组访问一组行和列。 .loc[] 主要基于标签,但也可以与布尔数组一起使用。 允许的输入为: 单个标签,例如’a’,标签列表或数组,例如。[…

    Python 2023年8月18日
    064
  • Python pandas DataFrame排序与去重操作

    本篇文章主要介绍了Python数据分析Pandas Dataframe排序与去重操作:1、DataFrame 的排序分为两种,一种是对索引进行排序,另一种是对值进行排序;2、Dat…

    Python 2023年8月16日
    043
  • ValueError: numpy.ufunc size changed, may indicate binary incompatibility. Expected 216 from C heade

    /usr/local/lib/python3.7/site-packages/empyrical/utils.py:32: UserWarning: Unable to impor…

    Python 2023年8月27日
    062
  • 利用Python解决掉谷歌人机验证,全自动识别真的牛啊

    一、接触前感受第一次带我领略yolov5风骚的是这个视频:【亦】警惕AI外挂!我写了一个枪枪爆头的视觉AI,又亲手”杀死”了它。这样一来,我对人工智能打游戏…

    Python 2023年11月9日
    063
  • Numpy基础入门知识点总结

    目录 1、ndarray创建与索引 1.1创建ndarray对象 1.1.1ndarray数据类型 1.1.2 ndarray创建 1.1.3 ndarray的索引与切片 2.2 …

    Python 2023年8月23日
    047
  • SAP ERP 里的 Costing Sheet 成本核算表

    有朋友在我的知识星球里向我提问: 请您帮忙讲一下这个AP0100的costing sheet rows这里都表示什么意思吗?比如row10、base Z010、overhead啥、…

    Python 2023年9月28日
    059
  • Selector的使用

    文章目录 Selector 的使用 * 1.直接使用 2. Scrapy Shell 3.XPath 选择器 4.CSS选择器 5.正则匹配 Selector 的使用 我们之前介绍…

    Python 2023年10月1日
    040
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球