废话不多说,直接上货....
由于这段时间以来,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最后一行,返回的是Series
data.iloc[-1:] #选取DataFrame最后一行,返回的是DataFrame
data.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 20882
1 1875
2 13124
3 803
4 117
...
183 536
184 8
185 630
186 1348
187 320
Name: Recovered, Length: 188, dtype: int64
data['Recovered'][4]
Out[8]: 117
data['Recovered'][0:len(list(data['Recovered']))]
Out[9]:
0 20882
1 1875
2 13124
3 803
4 117
...
183 536
184 8
185 630
186 1348
187 320
Name: Recovered, Length: 188, dtype: int64
list(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 开始
df
Out[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
关索 88
dtype: 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));
导入数据
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/b8ef22aa8878
https://www.jianshu.com/p/11a8df8f78bf
https://www.kesci.com/home/project/5ddc974ef41512002cec1dca
https://zhuanlan.zhihu.com/p/133784789
本文分享自微信公众号 - AI科技与算法编程(kangsinx)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4047540/blog/4409012