pandas必杀技能完结篇: 专治各种小白

百般思念 提交于 2021-02-14 23:21:38



(转载作者请注明出处)

废话不多说,直接上货....

思想和方法才是灵魂

前期提要:
Python | Pandas 快速处理文本数据
2020年数据分析必知必会(八):使用pandas查询数据和统计分析的应用(短小但强大)
2020年数据分析必知必会(七):pandas入门与数据结构基础
Pandas 是强大的开源数据分析和处理工具,建立在Python编程语言的基础上。 在本文中,我将展示有关 Pandas DataFrame的  相关技巧,以使得某些编程小白在实践的时候更容易一些。

由于这段时间以来,COVID-19 Data库API出现链接或者可能屏蔽的情况,因此建议在GitHub手动下载数据集

本文分析的数据集为2020/07/10的数据集:

https://github.com/CSSEGISandData/COVID-19/blob/master/csse_covid_19_data/csse_covid_19_daily_reports/07-10-2020.csv

1、pandas测试打印数据

使用  分组函数groupby

reset_index重置index

sum内部求和



源码如下:


打印csv文件中的所有数据:

打印指定的分组数据内容

打印指定分组数据

2、输出数据行列

输出csv文件中的列

输出其中的元素

输出csv文件数据的第一行

输出其中三行的一行数据

实际上,上面是csv数据文件就是python中的数据表而已,我们可以通过一个例子看看:

具体输出数据的知识点总结如下

data['w']  #选择表格中的'w'列,使用类字典属性,返回的是Series类型data.w    #选择表格中的'w'列,使用点属性,返回的是Series类型data[['w']]  #选择表格中的'w'列,返回的是DataFrame属性data[['w','z']]  #选择表格中的'w''z'data[0:2]  #返回第1行到第2行的所有行,前闭后开,包括前不包括后data[1:2]  #返回第2行,从0计,返回的是单行,通过有前后值的索引形式,       #如果采用data[1]则报错data.ix[1:2] #返回第2行的第三种方法,返回的是DataFrame,跟data[1:2]同data['a':'b']  #利用index值进行切片,返回的是**前闭后闭**的DataFrame,        #即末端是包含的  data.irow(0)   #取data的第一行data.icol(0)   #取data的第一列data.head()  #返回data的前几行数据,默认为前五行,需要前十行则dta.head(10)data.tail()  #返回data的后几行数据,默认为后五行,需要后十行则data.tail(10)ser.iget_value(0)  #选取ser序列中的第一个ser.iget_value(-1) #选取ser序列中的最后一个,这种轴索引包含索引器的series不能采用ser[-1]去获取最后一个,这回引起歧义。data.iloc[-1]   #选取DataFrame最后一行,返回的是Seriesdata.iloc[-1:]   #选取DataFrame最后一行,返回的是DataFramedata.loc['a',['w','x']]   #返回‘a’行'w''x'列,这种用于选取行索引列索引已知data.iat[1,1]   #选取第二行第二列,用于已知行、列位置的选取。

3、测试一下可视化

下面是确诊人数与治愈人数的全球国家和地区的关系



4、转化为列表:输出表中列数据

list(covid_data[0:3][0:2])Out[6]: ['FIPS', 'Admin2', 'Province_State', 'Country_Region', 'Last_Update', 'Lat', 'Long_', 'Confirmed', 'Deaths', 'Recovered', 'Active', 'Combined_Key', 'Incidence_Rate', 'Case-Fatality_Ratio']data['Recovered']Out[7]: 0      208821       18752      131243        8034        117       ...  183      536184        8185      630186     1348187      320Name: Recovered, Length: 188, dtype: int64data['Recovered'][4]Out[8]: 117data['Recovered'][0:len(list(data['Recovered']))]Out[9]: 0      208821       18752      131243        8034        117       ...  183      536184        8185      630186     1348187      320Name: Recovered, Length: 188, dtype: int64list(data['Recovered'][0:len(list(data['Recovered']))])Out[10]: [20882, 1875, 13124, 803, 117, 57, 38984,...... 886, 7530, 2671, 350, 536, 8, 630, 1348, 320]

5、从字典创建 Series

新建一个字典:


dict1={"战将姓名": "战将战力",   ...: "吕布": 100,   ...: "张飞": 98,   ...: "马超": 97,   ...: "关羽": 97,   ...: "许褚": 96,   ...: "赵云": 96,   ...: "典韦": 95,   ...: "文丑": 94,   ...: "甘宁": 94,   ...: "庞德": 94,   ...: "太史慈": 94,   ...: "黄忠": 93,   ...: "颜良": 93,   ...: "孙策": 93,   ...: "张辽": 93,   ...: "魏延": 92,   ...: "华雄": 92,   ...: "文鸳": 92,   ...: "周泰": 91,   ...: "夏侯渊,": 91,   ...: "孙坚": 90,   ...: "徐晃": 90,   ...: "夏侯敦": 90,   ...: "曹彰": 89,   ...: "姜维": 89,   ...: "张颌": 89,   ...: "凌统": 89,   ...: "吕玲绮": 88,   ...: "马云隶": 88,   ...: "关索": 88}df = pd.Series(dict1) # 如果不指定索引,则默认从 0 开始dfOut[30]: 战将姓名    战将战力吕布       100张飞        98马超        97关羽        97许褚        96赵云        96典韦        95文丑        94甘宁        94庞德        94太史慈       94黄忠        93颜良        93孙策        93张辽        93魏延        92华雄        92文鸳        92周泰        91夏侯渊,      91孙坚        90徐晃        90夏侯敦       90曹彰        89姜维        89张颌        89凌统        89吕玲绮       88马云隶       88关索        88dtype: object

6、 NumPy 数组创建 DataFrame

类似的我们可以获得:从字典对象创建DataFrame,并设置索引


7、保存pandas数据



打开当前py所在目录打开data.csv即可看到所有内容


8、查找pandas内容

包括行的数量;列名;每一列值的数量、类型

df.info()

9、取出某行某列



10、按索引取行和列


df.loc[df.index[[5, 4, 7]], ['animal', 'age']]


11、按范围取值

df[df['age'] > 5]

或者取行内部的

df[(df['age']>5) & (df['age']<8)]
# 或者df[df['age'].between(5, 8)]


12、取出数据丢失nan位置信息


13、修改panda数据内容

修改f行的age

df.loc['f', 'age'] = 2020


14、且某一列数据之和

15、按类比分开求平均值:不同动物求年龄均值

16、计算数据表中每一种类的数量

df['animal'].value_counts()

17、按类对数据排序:升序和降序

18、替换数据的内容:前提是只有两个的方便替换为布尔,否则不能全部替换


例如:将priority列中的yes, no替换为布尔值True, Fals


19、替换表中数据动物名

例如:

df['animal'] = df['animal'].replace('snake', '蛇')


20、插入某行和删除某行


21、删除重复的数

df = pd.DataFrame({'A': [1, 2, 2, 3, 4, 5, 5, 5, 6, 7, 7]})
print(df)
df1 = df.loc[df['A'].shift() != df['A']]
# 或者
# df1 = df.drop_duplicates(subset='A')
print(df1)

22、求最大的几个坐标


23、数据清晰环节

假设给了你一个数据不完整的表:首先将缺失数据自动补齐

根据文字的命令方式进行拆分为列或者行

例如:将From_To列从_分开,分成From, To两列,并删除原始列


统一文字大小写:

将数据中的标点符号去掉,以使得内容整洁


将数据中列表数据单独建立列来显示


24、按照不同类进行层次化的数据管理


如ABC三类分块索引表示

检验是否按照字典排序:


层次化之后可以类似底输出指定行内容:结果仍然保留层次化



25、可视化分析



plt.figure(2)
df = pd.DataFrame({"xs":[1,5,2,8,1], "ys":[4,2,1,9,6]})
df.plot.scatter("xs", "ys", color = "black", marker = "x")


plt.figure(3)
df = pd.DataFrame({"productivity":[5,2,3,1,4,5,6,7,8,3,4,8,9],
"hours_in" :[1,9,6,5,3,9,2,9,1,7,4,2,2],
"happiness" :[2,1,3,2,3,1,2,3,1,2,2,1,3],
"caffienated" :[0,0,1,1,0,0,0,0,1,1,0,1,0]})

df.plot.scatter("hours_in", "productivity", s = df.happiness * 100, c = df.caffienated)

plt.figure(4)
df = pd.DataFrame({"revenue":[57,68,63,71,72,90,80,62,59,51,47,52],
"advertising":[2.1,1.9,2.7,3.0,3.6,3.2,2.7,2.4,1.8,1.6,1.3,1.9],
"month":range(12)})

ax = df.plot.bar("month", "revenue", color = "green")
df.plot.line("month", "advertising", secondary_y = True, ax = ax)
ax.set_xlim((-1,12));





附录pandas相关内置函数

导入数据

pd.read_csv(filename):从CSV文件导入数据
pd.read_table(filename):从限定分隔符的文本文件导入数据
pd.read_excel(filename):从Excel文件导入数据
pd.read_sql(query, connection_object):从SQL表/库导入数据
pd.read_json(json_string):从JSON格式的字符串导入数据
pd.read_html(url):解析URL、字符串或者HTML文件,抽取其中的tables表格
pd.read_clipboard():从你的粘贴板获取内容,并传给read_table()
pd.DataFrame(dict):从字典对象导入数据,Key是列名,Value是数据

导出数据

df.to_csv(filename):导出数据到CSV文件
df.to_excel(filename):导出数据到Excel文件
df.to_sql(table_name, connection_object):导出数据到SQL表
df.to_json(filename):以Json格式导出数据到文本文件

创建测试对象

pd.DataFrame(np.random.rand(20,5)):创建20行5列的随机数组成的DataFrame对象
pd.Series(my_list):从可迭代对象my_list创建一个Series对象
df.index = pd.date_range('1900/1/30', periods=df.shape[0]):增加一个日期索引

查看、检查数据

df.head(n):查看DataFrame对象的前n行
df.tail(n):查看DataFrame对象的最后n行
df.shape():查看行数和列数
df.info():查看索引、数据类型和内存信息
df.describe():查看数值型列的汇总统计
s.value_counts(dropna=False):查看Series对象的唯一值和计数
df.apply(pd.Series.value_counts):查看DataFrame对象中每一列的唯一值和计数

数据选取

df[col]:根据列名,并以Series的形式返回列
df[[col1, col2]]:以DataFrame形式返回多列
s.iloc[0]:按位置选取数据
s.loc['index_one']:按索引选取数据
df.iloc[0,:]:返回第一行
df.iloc[0,0]:返回第一列的第一个元素

数据清理

df.columns = ['a','b','c']:重命名列名
pd.isnull():检查DataFrame对象中的空值,并返回一个Boolean数组
pd.notnull():检查DataFrame对象中的非空值,并返回一个Boolean数组
df.dropna():删除所有包含空值的行
df.dropna(axis=1):删除所有包含空值的列
df.dropna(axis=1,thresh=n):删除所有小于n个非空值的行
df.fillna(x):用x替换DataFrame对象中所有的空值
s.astype(float):将Series中的数据类型更改为float类型
s.replace(1,'one'):用‘one’代替所有等于1的值
s.replace([1,3],['one','three']):用'one'代替1,用'three'代替3
df.rename(columns=lambda x: x + 1):批量更改列名
df.rename(columns={'old_name': 'new_ name'}):选择性更改列名
df.set_index('column_one'):更改索引列
df.rename(index=lambda x: x + 1):批量重命名索引

数据处理

df[df[col] > 0.5]:选择col列的值大于0.5的行
df.sort_values(col1):按照列col1排序数据,默认升序排列
df.sort_values(col2, ascending=False):按照列col1降序排列数据
df.sort_values([col1,col2], ascending=[True,False]):先按列col1升序排列,后按col2降序排列数据
df.groupby(col):返回一个按列col进行分组的Groupby对象
df.groupby([col1,col2]):返回一个按多列进行分组的Groupby对象
df.groupby(col1)[col2]:返回按列col1进行分组后,列col2的均值
df.pivot_table(index=col1, values=[col2,col3], aggfunc=max):创建一个按列col1进行分组,并计算col2和col3的最大值的数据透视表
df.groupby(col1).agg(np.mean):返回按列col1分组的所有列的均值
data.apply(np.mean):对DataFrame中的每一列应用函数np.mean
data.apply(np.max,axis=1):对DataFrame中的每一行应用函数np.max

数据合并

df1.append(df2):将df2中的行添加到df1的尾部
df.concat([df1, df2],axis=1):将df2中的列添加到df1的尾部
df1.join(df2,on=col1,how='inner'):对df1的列和df2的列执行SQL形式的join

数据统计

df.describe():查看数据值列的汇总统计
df.mean():返回所有列的均值
df.corr():返回列与列之间的相关系数
df.count():返回每一列中的非空值的个数
df.max():返回每一列的最大值
df.min():返回每一列的最小值
df.median():返回每一列的中位数
df.std():返回每一列的标准差





参考文献

https://www.jianshu.com/u/b8ef22aa8878https://www.jianshu.com/p/11a8df8f78bfhttps://www.kesci.com/home/project/5ddc974ef41512002cec1dcahttps://zhuanlan.zhihu.com/p/133784789



本文分享自微信公众号 - AI科技与算法编程(kangsinx)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!