数据抽取
字段拆分
对字符串类型的处理
slice() 函数:实现字符串的切片
split() 函数:按分隔符拆分字符串
df1 = pd.read_csv(r'/.../str_op2.csv')
df1['name'].str.split(n = 1, expand = True) # 默认分隔符为空格 分隔数量为所有 结果为列表 若expand = True则结果为DataFrame
str_op2.csv
时间型数据列的处理
df2 = pd.read_csv(r'/.../dt_op.csv')
df2['date'] = pd.to_datetime(df2['注册时间'])
df2['date_year'] = df2['date'].dt.year # 从时间类型数据中,抽取出如年、月、日等数据属性
df2['date_month'] = df2['date'].dt.month
df2['date_day'] = df2['date'].dt.day
print(df2.head())
电话 注册时间 是否微信 ... date_year date_month date_day
0 166412894295 2011/1/1 12:13:24 否 ... 2011 1 1
1 135416795207 2012/2/3 1:15:38 否 ... 2012 2 3
2 177423353436 2013/3/2 13:54:55 是 ... 2013 3 2
3 189424978309 2014/4/11 11:00:03 是 ... 2014 4 11
4 134450811715 2015/5/18 10:02:23 否 ... 2015 5 18
记录抽取
dIndex = df1['name'].str.contains('华为', na = False) # 本质上是使用布尔数组来抽取
print(df1[dIndex])
name
1 华为 MediaPad 7Vogue
3 华为(HUAWEI) 荣耀X1
关于na参数:'na参数用来控制原来series中有空值时,如何匹配。如果na=False,那空值就当作不匹配,返回False。na=True,那空值就当匹配上了,返回True。使用默认值,空值还是原样返回(保持空值)'
随机抽样
df3 = pd.read_csv(r'/.../sample_data.csv')
print(df3)
ID 姓名 消费
0 1 刘一 256
1 2 陈二 239
2 3 张三 282
3 4 李四 245
4 5 王五 162
5 6 赵六 295
6 7 孙七 173
7 8 周八 197
8 9 吴九 236
9 10 郑十 311
print(df3.sample(n=7,replace=True)) # 放回抽样
ID 姓名 消费
8 9 吴九 236
2 3 张三 282
7 8 周八 197
9 10 郑十 311
9 10 郑十 311
3 4 李四 245
3 4 李四 245
print(df3.sample(frac=0.5,replace=False)) # 按百分比不放回抽样(个数或者百分比只能选一个)
ID 姓名 消费
8 9 吴九 236
2 3 张三 282
4 5 王五 162
7 8 周八 197
9 10 郑十 311
多表数据合并
concat() 函数
几种链接方法
df_apple = pd.read_csv(r'/.../apple.csv')
df_apple_tmp = df_apple['title'].str.split(n=1,expand=True)
df_apple_tmp.columns = ['品牌','产品名称']
df_mi = pd.read_csv(r'/.../mi.csv')
df_mi_tmp = df_mi['title'].str.split(n=1,expand=True)
df_mi_tmp.columns = ['品牌','产品名称']
df = pd.concat([df_apple_tmp,df_mi_tmp[1:]]) # concat是pandas库的全局函数 默认axis=0按行(在下方)合并 默认join='outer'外链接 没有元素则置为空
print(df)
品牌 产品名称
0 Apple iPad Air
1 Apple iPad mini
2 Apple iPhone 7
3 Apple iPhone X
4 Apple iPad Air 2
1 小米(MI) MIX 2
2 小米(MI) MAX
3 小米(MI) MAX 2
4 小米(MI) 7
print(pd.concat([df_apple_tmp,df_mi_tmp[1:]],axis=1,join='inner')) # axis=1按列合并 join=inner内链接 只包含[索引号]相同的
品牌 产品名称 品牌 产品名称
1 Apple iPad mini 小米(MI) MIX 2
2 Apple iPhone 7 小米(MI) MAX
3 Apple iPhone X 小米(MI) MAX 2
4 Apple iPad Air 2 小米(MI) 7
merge()函数
几种链接方法
df_name = pd.read_csv(r'/.../product_name.csv')
df_price = pd.read_csv(r'/.../product_price.csv')
product_name.csv
product_price.csv
df_i = pd.merge(df_name,df_price,left_on='id',right_on='id',how='inner') # 以id关联 内链接
df_o = pd.merge(df_name,df_price,left_on='id',right_on='id',how='outer') # 外链接 关联项的域不同
df_l = pd.merge(df_name,df_price,left_on='id',right_on='id',how='left') # 左链接 以左边表的关联列链接
df_r = pd.merge(df_name,df_price,left_on='id',right_on='id',how='right') # 右链接 以右边表的关联列链接
数据分组
连续型数据分组
将连续型(数值型)数据进行等距或非等距的分组,这个过程也称为数据离散化
cut_data.csv
df1 = pd.read_csv(r'/.../cut_data.csv')
bins = [0,20,40,60,80,100,120] # 用于指定分组的列表
print(pd.cut(df1['cost'],bins=bins)) # 参数right分组区间右边是否封闭,默认封闭
0 (0, 20]
1 (0, 20]
2 (60, 80]
3 (0, 20]
4 (80, 100]
5 (0, 20]
6 (80, 100]
7 (60, 80]
8 (0, 20]
9 (40, 60]
10 (20, 40]
11 (0, 20]
12 (60, 80]
13 (80, 100]
14 (0, 20]
Name: cost, dtype: category
Categories (6, interval[int64]): [(0, 20] < (20, 40] < (40, 60] < (60, 80] < (80, 100] < (100, 120]]
clabels = ['A','B','C','D','E','F'] # 分组后每组的自定义标签,可不自定义
print(pd.cut(df1['cost'],bins=bins,labels=clabels))
0 A
1 A
2 D
3 A
4 E
5 A
6 E
7 D
8 A
9 C
10 B
11 A
12 D
13 E
14 A
Name: cost, dtype: category
Categories (6, object): ['A' < 'B' < 'C' < 'D' < 'E' < 'F']
离散型数据分组
gb_data.csv
df2 = pd.read_csv(r'/.../gb_data.csv')
gb_data = df2.groupby('Gender')
print(gb_data) # 分组结果是对象
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f7b90e0a6a0>
print(gb_data.groups) # groups属性可以获取到具体分组情况
{'Female': [2, 4, 7], 'Male': [0, 1, 3, 5, 6]}
print(gb_data.get_group('Female')) # 以DataFrame形式返回某一具体分组
Name Gender Age Score
2 Cidy Female 18 93
4 Ellen Female 17 96
7 Hebe Female 22 98
分组数据统计
gb_data.describe() # 返回每个分组可计算的详细统计数据
print(gb_data.min()) # 也可以使用这些计算方法
Name Age Score
Gender
Female Cidy 17 93
Male Bob 18 80
print(gb_data.mean())
Age Score
Gender
Female 19.0 95.666667
Male 19.6 89.000000
print(gb_data.sum())
Age Score
Gender
Female 57 287
Male 98 445