数据抽取
关于数据抽取操作,我们前面讲它的理论部分时曾说过,它又可以细分为很多种操作。PS:这一节中的示例有点点多,请大家耐心看完,谢谢啦。
下面我们一一来学习它们的具体使用:
1、字段抽取
import pandas as pd
from pandas import Series
from pandas import DataFrame
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = DataFrame({'手机':Series(['13911272345','13911273456','13911275675','13911271234','13911272468','13911270987'])})
#这里需要注意:必须在df['手机']加上“.str”
#然后再调用slice(),否则会提示Series对象没有slice()方法
first = df['手机'].str.slice(0,3)
middle = df['手机'].str.slice(3,7)
last = df['手机'].str.slice(7,11)
#利用抽取得来的数据重新组合新的数组,并输出
df = DataFrame({'first':first,'middle':middle,'last':last})
print(df)
其运行结果如下:
first middle last
0 139 1127 2345
1 139 1127 3456
2 139 1127 5675
3 139 1127 1234
4 139 1127 2468
5 139 1127 0987
2、字段拆分,在拆分诸如IP地址这样的数据时非常方便:
import pandas as pd
from pandas import Series
from pandas import DataFrame
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = DataFrame({'IP地址':Series(['1.1.1.1','192.168.123.123','123.123.123.123','255.50.50.1'])})
df2 = df['IP地址'].str.split('.',4,True)
print(df2)
print()
df2.columns=['IP1','IP2','IP3','IP4']
print(df2)
其运行结果如下:
0 1 2 3
0 1 1 1 1
1 192 168 123 123
2 123 123 123 123
3 255 50 50 1
IP1 IP2 IP3 IP4
0 1 1 1 1
1 192 168 123 123
2 123 123 123 123
3 255 50 50 1
3、重置索引:将某一列作为整个数据表的索引,方便后续的操作:
import pandas as pd
from pandas import Series
from pandas import DataFrame
from pandas import read_excel
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = read_excel(r'E:\tmp\pandas\example1.xlsx',sheet_name='Sheet1')
df1 = df.head()
print(df1.set_index('学号'))
print()
print(df1)
其运行结果如下:
4、条件抽取,把符合一定条件的数据提取出来:
import pandas as pd
from pandas import Series
from pandas import DataFrame
from pandas import read_excel
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = read_excel(r'E:\tmp\pandas\example1.xlsx',sheet_name='Sheet1')
#下面这两代码的意思是:
#把成绩单中英语成绩大于120分的数据单独拎出来
#注意:在这个成绩单的数据表中,所有的数字都是以字符串形式存在
#因此要想做比较,则必须先做类型转换,利用astype(int)转为int类型
print(df[df.英语.astype(int)>120].shape)
print(df[df.英语.astype(int)>120].head())
print()
#下面这两代码的意思是:
#把所有英语成绩介于120到150之间的数据单独拎出来
print(df[df.英语.astype(int).between(130,150)].shape)
print(df[df.英语.astype(int).between(130,150)].head())
print()
#下面这两代码的意思是:
#把所有语文成绩中缺考的数单独拎出来
print(df[df.语文=='缺考'].shape)
print(df[df.语文=='缺考'])
print()
#下面这两代码的意思是:
#把所有语文成绩中缺考或作弊、物理成绩中缺考或作弊的数据拎出来
print(df[(df.语文=='缺考')|(df.语文=='作弊')|(df.物理=='作弊')|(df.物理=='缺考')].shape)
print(df[(df.语文=='缺考')|(df.语文=='作弊')|(df.物理=='作弊')|(df.物理=='缺考')])
print()
#下面这两行代码的意思:
#把语文成绩中包含缺考的数据拿出来
print(df[df.语文.str.contains('缺考',na=False)].shape)
print(df[df.语文.str.contains('缺考',na=False)])
其运行结果如下:
5、随机抽样,利用获取的随机数值作为索引来随机抽取其中的数据,索引通常作为行索引,因为默认情况下的行索引是整数值,而我们得出来的随机数值也通常会是整数值:
import numpy as np
import pandas as pd
from pandas import Series
from pandas import DataFrame
from pandas import read_excel
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = read_excel(r'E:\tmp\pandas\example1.xlsx',sheet_name='Sheet1')
index = np.random.randint(0,30,5)
print(index)
print(df.loc[index,:])
其运行结果如下:
6、通过索引获取数据,有很多种方式:提供行索引、提供列标签、采用索引列表等:
import pandas as pd
from pandas import Series
from pandas import DataFrame
from pandas import read_excel
#设置字段对齐
pd.set_option('display.unicode.ambiguous_as_wide', True)
pd.set_option('display.unicode.east_asian_width', True)
df = read_excel(r'E:\tmp\pandas\example1.xlsx',sheet_name='Sheet1')
#loc[start:end]表示抽取从start开始,到end截止的这么多行的数据
print(df.loc[0:3])
print()
#下面这种索引抽取方式则是以某个列名为索引来抽取,我们这里显示结果前5行
#得到的是一个Series对象,不再是DataFrame对象!!!!!
print(df.loc[:,'数学'].head())
print()
#下面这种索引抽取方式则是以行索引来抽取,得到的是Series对象!!!!!
print(df.loc[1])
print()
#下面这种方式是以索引列表的形式来获取,所得到的则是一个DataFrame对象
print(df.loc[[0,3]])
#下面这种方式使用索引号来获取数据:df.iloc[行索引号,列索引号]
#抽取第1行、第4列的数据,返回的是单个值
print(df.iloc[1,4])
print()
#抽取第1行和第3行上的数据
print(df.iloc[[0,3],:])
print()
#抽取第1行到第3行上的数据
print(df.iloc[0:3,:])
print()
#抽取所有数据的第6列的数据,结果是Series对象
print(df.iloc[:,5].head())
print()
#抽取第2行上的全部数据,结果是Series对象
print(df.iloc[1,:])
print()
得到的结果如下(这里需要两张运行结果截图来展示):
7、以字典形式获取数据:就是把一个字典中的key和value都变成一个DataFrame对象中的列:
import pandas as pd
from pandas import DataFrame
my_dict={'col1':'[a,b,c]','col2':'[1,2,3]'}
#以字典为数据对象构建DataFrame对象,注意这里的orient参数含义
df = DataFrame.from_dict(my_dict,orient='index')
#下面这七行代码则告诉我们如何把一个字典中的key和value都
#编程一个DataFrame对象中的列,并重置DataFrame对象的索引
#请务必仔细看每一步的输出结果的变化
print(df)
print()
df=df.reset_index()
print(df)
print()
df.columns=['key','value']
print(df)
其运行结果如下:
2总结
这一小节,我们主要就如何进行数据抽取来做一些实践示例的分享。虽然有典型的其中数据抽取操作,但实际数据抽取中会用到的哪种或哪几种,完全取决于当时的实际问题需要。请各位看官尽量多掌握几种,以免用时发生临时抱佛脚的尴尬。
OK,本节的知识暂时分享到这,谢谢大家!我们下一节的分享中,不见不散!