数据处理2(记录合并、记录合并、字段合并、字段匹配、数据标准化、数据分组、时间处理、虚拟变量)

随机抽样

import numpy
import pandas
data=pandas.read_csv('/Users/cuiwenhao/Data_xxx/4.9/data.csv')

#设置随机种子
numpy.random.seed(seed=2)
a=data.sample(n=10)
print(a)
    id  class  score
83  84      3     52
30  31      1     46
56  57      1     96
24  25      1     77
16  17      2    115
23  24      1     84
2    3      3     46
27  28      1     73
28  29      2     58
13  14      2     69

#按照百分比抽样
b=data.sample(frac=0.02)
print(b)
    id  class  score
23  24      1     84
30  31      1     46
#是否可放回抽样,
#replace=True,可放回, 
#replace=False,不可放回
c=data.sample(n=10, replace=True)

#典型抽样,分层抽样
gbr = data.groupby("class")#按照class分组
gbr.groups#分成了3个班
{1: Int64Index([ 1,  4,  9, 12, 19, 23, 24, 25, 27, 30, 32, 36, 37, 39, 40, 43, 44,
            46, 47, 49, 53, 56, 60, 70, 76, 78, 79, 92, 93, 98],
           dtype='int64'), 2: Int64Index([ 3,  8, 11, 13, 14, 15, 16, 18, 20, 21, 22, 28, 29, 35, 38, 45, 51,
            54, 57, 62, 63, 68, 71, 72, 74, 75, 80, 81, 84, 85, 86, 87, 89, 94,
            96, 97, 99],
           dtype='int64'), 3: Int64Index([ 0,  2,  5,  6,  7, 10, 17, 26, 31, 33, 34, 41, 42, 48, 50, 52, 55,
            58, 59, 61, 64, 65, 66, 67, 69, 73, 77, 82, 83, 88, 90, 91, 95],
           dtype='int64')}
typicalNDict = {
    1: 2,  #1班抽2个
    2: 4, #2班抽4个
    3: 6  }

def typicalSampling(group, typicalNDict):
    name = group.name
    n = typicalNDict[name]
    return group.sample(n=n)

result = data.groupby(
    'class', group_keys=False
).apply(typicalSampling, typicalNDict)
print(result)
    id  class  score
79  80      1     83
53  54      1     95
63  64      2     71
84  85      2     85
14  15      2     50
71  72      2    107
58  59      3     90
91  92      3     59
26  27      3     64
69  70      3     96
7    8      3     48
33  34      3     67

def typicalSampling(group, typicalFracDict):
    name = group.name
    frac = typicalFracDict[name]
    return group.sample(frac=frac)

result1 = data.groupby(
    'class', group_keys=False
).apply(typicalSampling, typicalFracDict)
print(result1)

记录合并

  • 记录合并函数:concat([dataFrame1,dataFrame2,…])
    • 参数说明
      • dataFrame1 数据框
      • dataFrame2 数据框
    • 返回值:DataFrame
import pandas
from pandas import read_csv

data1 = read_csv( '/Users/cuiwenhao/Data_xxx/4.10/data1.csv', sep="|")
data2 = read_csv(
    '/Users/cuiwenhao/Data_xxx/4.10/data2.csv', sep="|"
)
data3 = read_csv(
    '/Users/cuiwenhao/Data_xxx/4.10/data3.csv', sep="|"
)
data = pandas.concat([data1, data2, data3])

data11 = pandas.concat([
     data1[[0, 1]],
     data2[[1, 2]],
     data3[[0, 2]]
 ])

data1:

data2:



data3:

合并后的data:


字段合并

  • 字段合并方法:x=x1+x2+…
from pandas import read_csv

df = read_csv(
    '/Users/cuiwenhao/Data_xxx/4.11/data.csv',
    sep=" ", names=['band', 'area', 'num'])
print(df)
   band  area   num
0   189  2225  4812
1   135  2225  5003
2   134  2225  9938
3   188  2225  6753
4   189  2225  3721
5   134  2225  9313
6   138  2225  4373
7   133  2225  2452
8   189  2225  7681

df = df.astype(str)
tel = df['band'] + df['area'] + df['num']
df['tel'] = tel
print(df)
  band  area   num          tel
0  189  2225  4812  18922254812
1  135  2225  5003  13522255003
2  134  2225  9938  13422259938
3  188  2225  6753  18822256753
4  189  2225  3721  18922253721
5  134  2225  9313  13422259313
6  138  2225  4373  13822254373
7  133  2225  2452  13322252452
8  189  2225  7681  18922257681

字段匹配(类似vlookup)

  • 字段匹配参数:merage(x,y,left_on,right_on)
    • 参数说明
      • x :第一个数据框
      • y :第二个数据框
      • left_on :第一个数据框用于匹配的列
      • right_on : 第二个数据框用于匹配的列
import pandas

items = pandas.read_csv(
    '/Users/cuiwenhao/Data_xxx/4.12/data1.csv',
    sep='|', 
    names=['id', 'comments', 'title'])

prices = pandas.read_csv(
     '/Users/cuiwenhao/Data_xxx/4.12/data2.csv',
     sep='|',
     names=['id', 'oldPrice', 'nowPrice'] )

items:



price:


 #默认只是保留连接上的部分
itemPrices = pandas.merge(
     items,
     prices,
     left_on='id',
     right_on='id')
 #即使连接不上,也保留右边没连上的部分
itemPrices = pandas.merge(
     items,
     prices,
     left_on='id',
     right_on='id',
     how='right')
#即使连接不上,也保留所有没连上的部分
itemPrices = pandas.merge(
    items, 
    prices, 
    left_on='id', 
    right_on='id',
    how='outer')

简单计算

import pandas
data = pandas.read_csv(
    '/Users/cuiwenhao/Data_xxx/4.13/data.csv', 
    sep="|" )
data['total'] = data.price*data.num

数据标准化


原数据:


data['scale'] = round(
    (
        data.score-data.score.min()
    )/(
        data.score.max()-data.score.min()
    )
    , 2) # 保留两位小数

   class name  score  scale
0     一班  朱志斌    120   0.55
1     一班   朱凤    122   0.59
2     一班  郑丽萍    140   1.00
3     一班  郭杰明    131   0.80
4     一班   许杰    122   0.59
5     二班   郑芬    119   0.52
6     二班   林龙     96   0.00
7     二班  林良坤    135   0.89
8     二班  黄志红    105   0.20
9     三班  方小明    114   0.41
10    三班  陈丽灵    115   0.43
11    三班  方伟君    136   0.91
12    三班  庄艺家    119   0.52

数据分组

  • cut函数:cut(series,bins,right=True,labels=NUll)
    • series 需要分组的数据
    • bins:分组的划分数组
    • right:分组的时候,右边是否闭合
    • labels: 分组的自定义标签,可以不自定义
import pandas
data = pandas.read_csv( '/Users/cuiwenhao/Data_xxx/4.15/data.csv', sep='|')
             tel   cost
0   166424556600    2.0
1   166424557199    5.0
2   166424561768   75.3
3   166424569696   20.0
4   166424569924   97.3
5   166424579238    3.0
6   166424581334  100.0
7   166424589730   77.0
8   166424591167    5.5
9   166424598020   50.0
10  166424598259   28.6
11  166424606270   10.8
12  166424632819   76.7
13  166424635250   84.6
14  166424641824   10.0
#设置分组 区间最小值-1,最大值+1(能全都包含进去)
bins = [ min(data.cost)-1, 20, 40, 60, 80, 100, max(data.cost)+1]
data['cut'] = pandas.cut(
    data.cost, 
    bins)
             tel   cost            cut
0   166424556600    2.0    (1.0, 20.0]
1   166424557199    5.0    (1.0, 20.0]
2   166424561768   75.3   (60.0, 80.0]
3   166424569696   20.0    (1.0, 20.0]
4   166424569924   97.3  (80.0, 100.0]
5   166424579238    3.0    (1.0, 20.0]
6   166424581334  100.0  (80.0, 100.0]
7   166424589730   77.0   (60.0, 80.0]
8   166424591167    5.5    (1.0, 20.0]
9   166424598020   50.0   (40.0, 60.0]
10  166424598259   28.6   (20.0, 40.0]
11  166424606270   10.8    (1.0, 20.0]
12  166424632819   76.7   (60.0, 80.0]
13  166424635250   84.6  (80.0, 100.0]
14  166424641824   10.0    (1.0, 20.0]
#右边闭合
data['cut'] = pandas.cut(
    data.cost, 
    bins, 
    right=False)

             tel   cost             cut
0   166424556600    2.0     [1.0, 20.0)
1   166424557199    5.0     [1.0, 20.0)
2   166424561768   75.3    [60.0, 80.0)
3   166424569696   20.0    [20.0, 40.0)
4   166424569924   97.3   [80.0, 100.0)
5   166424579238    3.0     [1.0, 20.0)
6   166424581334  100.0  [100.0, 101.0)
7   166424589730   77.0    [60.0, 80.0)
8   166424591167    5.5     [1.0, 20.0)
9   166424598020   50.0    [40.0, 60.0)
10  166424598259   28.6    [20.0, 40.0)
11  166424606270   10.8     [1.0, 20.0)
12  166424632819   76.7    [60.0, 80.0)
13  166424635250   84.6   [80.0, 100.0)
14  166424641824   10.0     [1.0, 20.0)

#自定义分组标签
labels = [
    '20以下', '20到40', '40到60', 
    '60到80', '80到100', '100以上'
]

data['cut'] = pandas.cut(
    data.cost, bins, 
    right=False, labels=labels
)
             tel   cost     cut
0   166424556600    2.0    20以下
1   166424557199    5.0    20以下
2   166424561768   75.3   60到80
3   166424569696   20.0   20到40
4   166424569924   97.3  80到100
5   166424579238    3.0    20以下
6   166424581334  100.0   100以上
7   166424589730   77.0   60到80
8   166424591167    5.5    20以下
9   166424598020   50.0   40到60
10  166424598259   28.6   20到40
11  166424606270   10.8    20以下
12  166424632819   76.7   60到80
13  166424635250   84.6  80到100
14  166424641824   10.0    20以下

时间处理

  • 时间格式化:是指将时间型数据,按照指定格式,转为字符型数据
  • 时间格式化函数:dateTimeFormat=datetime.dt.strtime(format)


import pandas
data = pandas.read_csv(
    '/Users/cuiwenhao/Data_xxx/4.16/data.csv',
    encoding='utf8')
#转换为时间型格式
data['时间'] = pandas.to_datetime(
    data.注册时间, 
    format='%Y/%m/%d')
#时间形式转换为字符型数据
data['格式化时间'] = data.时间.dt.strftime('%Y-%m-%d')

data['时间.年'] = data['时间'].dt.year
data['时间.月'] = data['时间'].dt.month
data['时间.周'] = data['时间'].dt.weekday
data['时间.日'] = data['时间'].dt.day
data['时间.时'] = data['时间'].dt.hour
data['时间.分'] = data['时间'].dt.minute
data['时间.秒'] = data['时间'].dt.second

虚拟变量

  • 离散特征的取值之间有大小意义的处理函数
  • panads.Series.map(dict)
    • dict 映射字典
# -*- coding: utf-8 -*-
import pandas

data = pandas.read_csv(
    '/Users/cuiwenhao/Data_xxx/4.18/data.csv',
    encoding='utf8'
)

data['Education Level'].drop_duplicates()#去重
print(data)
0               Doctorate
3       Bachelor's Degree
6         Master's Degree
20     Associate's Degree
35           Some College
102              Post-Doc
111          Trade School
157           High School
187          Grade School

"""
博士后    Post-Doc
博士      Doctorate
硕士      Master's Degree
学士      Bachelor's Degree
副学士    Associate's Degree
专业院校  Some College
职业学校  Trade School
高中      High School
小学      Grade School
"""

educationLevelDict = {
    'Post-Doc': 9,
    'Doctorate': 8,
    'Master\'s Degree': 7,
    'Bachelor\'s Degree': 6,
    'Associate\'s Degree': 5,
    'Some College': 4,
    'Trade School': 3,
    'High School': 2,
    'Grade School': 1
}
#有大小意义的映射字典
data['Education Level Map'] = data[
    'Education Level'
].map(
    educationLevelDict
)

       Age     Education Level  Gender  Education Level Map
0     33.0           Doctorate    Male                    8
1     47.0           Doctorate    Male                    8
2      NaN           Doctorate    Male                    8
3     35.0   Bachelor's Degree    Male                    6
4     32.0   Bachelor's Degree    Male                    6
5     32.0   Bachelor's Degree    Male                    6
6     32.0     Master's Degree    Male                    7
7     32.0   Bachelor's Degree    Male                    6
8     33.0     Master's Degree    Male                    7
9     44.0     Master's Degree    Male                    7
10    39.0     Master's Degree    Male                    7
  • 没有大小意义用
    • panads.get_dummies()


data['Gender'].drop_duplicates()#去重
0       Male
13    Female
39       NaN

#没有大小意义的用pandas.get_dummies
dummies = pandas.get_dummies(
    data, 
    columns=['Gender'],
    prefix=['Gender'],
    prefix_sep="_",
    dummy_na=False,
    drop_first=False
)
      Age     Education Level     ...       Gender_Female  Gender_Male
0     33.0           Doctorate     ...                   0            1
1     47.0           Doctorate     ...                   0            1
2      NaN           Doctorate     ...                   0            1
3     35.0   Bachelor's Degree     ...                   0            1
4     32.0   Bachelor's Degree     ...                   0            1
5     32.0   Bachelor's Degree     ...                   0            1
6     32.0     Master's Degree     ...                   0            1
7     32.0   Bachelor's Degree     ...                   0            1
8     33.0     Master's Degree     ...                   0            1
9     44.0     Master's Degree     ...                   0            1
10    39.0     Master's Degree     ...                   0            1
11    29.0     Master's Degree     ...                   0            1
12    41.0           Doctorate     ...                   0            1
13    44.0           Doctorate     ...                   1            0
14    59.0     Master's Degree     ...                   0            1
15    45.0   Bachelor's Degree     ...                   0            1

dummies['Gender'] = data['Gender']
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容