数据处理1(重复值、缺失值、字段抽取\拆分、记录抽取)

重复值处理

  • 把数据结构中,行相同的数据只保留一行。
  • 函数:drop_duplicates()
from pandas import read_csv
df = read_csv('/Users/cuiwenhao/Data_xxx/4.3/data.csv')
print(df)
        id   key          value
0  1251147    品牌          Apple
1  1251147  商品名称  苹果iPad mini 3
2  1251147  商品毛重         0.61kg
3  1251147  商品产地             中国
4  1251147    品牌          Apple
5  1251147  商品名称  苹果iPad mini 3
6  1251147    硬盘           128G
7  1251147    尺寸      7.8英寸-9英寸
#找出行重复的位置
dIndex = df.duplicated()
print(dIndex)
0    False
1    False
2    False
3    False
4     True
5     True
6    False
7    False
dtype: bool
#根据某些列,找出重复的位置
dIndex_id = df.duplicated('id')
print(dIndex_id)
0    False
1     True
2     True
3     True
4     True
5     True
6     True
7     True
dIndex_idkey = df.duplicated(['id', 'key'])
print(dIndex_idkey)
0    False
1    False
2    False
3    False
4     True
5     True
6    False
7    False
dtype: bool

#根据返回值,把重复数据提取出来
print(df[dIndex])
        id   key          value
4  1251147    品牌          Apple
5  1251147  商品名称  苹果iPad mini 3

#原值
        id   key          value
0  1251147    品牌          Apple
1  1251147  商品名称  苹果iPad mini 3
2  1251147  商品毛重         0.61kg
3  1251147  商品产地             中国
4  1251147    品牌          Apple
5  1251147  商品名称  苹果iPad mini 3
6  1251147    硬盘           128G
7  1251147    尺寸      7.8英寸-9英寸
#直接删除重复值
#默认根据所有的列,进行删除
newDF = df.drop_duplicates()
print(newDF)
        id   key          value
0  1251147    品牌          Apple
1  1251147  商品名称  苹果iPad mini 3
2  1251147  商品毛重         0.61kg
3  1251147  商品产地             中国
6  1251147    硬盘           128G
7  1251147    尺寸      7.8英寸-9英寸

#当然也可以指定某一列,进行重复值处理
newDF_id= df.drop_duplicates('id')
print(newDF_id)
        id key  value
0  1251147  品牌  Apple

缺失数据处理

  • dropna函数作用:去除数值结果中值为空的数据
  • drop函数语法:dropna()
from pandas import read_csv
df = read_csv( '/Users/cuiwenhao/Data_xxx/4.4/data.csv')
print(df)
        id   key          value
0  1251147    品牌          Apple
1  1251147  商品名称  苹果iPad mini 3
2  1251147  商品毛重            NaN
3  1251147   NaN             中国
4  1251147    硬盘           128G
5  1251147    尺寸      7.8英寸-9英寸
#找出空值的位置
isNA = df.isnull()
print(isNA)#找出NaN值
      id    key  value
0  False  False  False
1  False  False  False
2  False  False   True
3  False   True  False
4  False  False  False
5  False  False  False
#获取出空值所在的行
df[isNA.any(axis=1)]
        id   key value
2  1251147  商品毛重   NaN
3  1251147   NaN    中国

#key为空值的行
df[isNA[['key']].any(axis=1)]
        id  key value
3  1251147  NaN    中国

#key和value为空值的行
df[isNA[['key', 'value']].any(axis=1)]
        id   key value
2  1251147  商品毛重   NaN
3  1251147   NaN    中国

#NaN填充为未知
df.fillna('未知')
        id   key          value
0  1251147    品牌          Apple
1  1251147  商品名称  苹果iPad mini 3
2  1251147  商品毛重             未知
3  1251147    未知             中国
4  1251147    硬盘           128G
5  1251147    尺寸      7.8英寸-9英寸
#直接删除空值
newDF = df.dropna()
        id   key          value
0  1251147    品牌          Apple
1  1251147  商品名称  苹果iPad mini 3
4  1251147    硬盘           128G
5  1251147    尺寸      7.8英寸-9英寸

字段抽取

from pandas import read_csv

df = read_csv( '/Users/cuiwenhao/Data_xxx/4.6/data.csv')
print(df)
           tel
0  18922254812
1  13522255003
2  13422259938
3  18822256753
4  18922253721
5  13422259313
6  13822254373
7  13322252452
8  18922257681
#转为字符串类型
df['tel']=df['tel'].astype(str)
#运营商
bands = df['tel'].str.slice(0, 3)
print(bands)
0    189
1    135
2    134
3    188
4    189
5    134
6    138
7    133
8    189
Name: tel, dtype: object
#地区
areas = df['tel'].str.slice(3, 7)
print(areas)
0    2225
1    2225
2    2225
3    2225
4    2225
5    2225
6    2225
7    2225
8    2225
Name: tel, dtype: object
#号码段
nums = df['tel'].str.slice(7, 11)
print(nums)
0    4812
1    5003
2    9938
3    6753
4    3721
5    9313
6    4373
7    2452
8    7681
Name: tel, dtype: object
#赋值回去
df['bands'] = bands
df['areas'] = areas
df['nums'] = nums
print(df)
      tel       bands areas nums
0  18922254812   189  2225  4812
1  13522255003   135  2225  5003
2  13422259938   134  2225  9938
3  18822256753   188  2225  6753
4  18922253721   189  2225  3721
5  13422259313   134  2225  9313
6  13822254373   138  2225  4373
7  13322252452   133  2225  2452
8  18922257681   189  2225  7681

字段拆分

from pandas import read_csv
df = read_csv('/Users/cuiwenhao/Data_xxx/4.5/data.csv')
print(df)
   id        name
0   1         KEN
1   2      JIMI  
2   3        John
newName1 = df['name'].str.lstrip()
0       KEN
1    JIMI  
2      John

newName2 = df['name'].str.rstrip()
0         KEN
1        JIMI
2        John

newName3 = df['name'].str.strip()
0     KEN
1    JIMI
2    John

df['name'] = newName3
   id  name
0   1   KEN
1   2  JIMI
2   3  John

记录抽取

  • 常用的条件类型
    • 比较运算
      大于>,小于<,大于等于>=,小于等于<=,不等于!=
      例如:df[df.comments>10000];
    • 范围运算 between(left,right)
      df[df.commentsbetween(1000,100000];
    • 空值匹配 pandas.isnull(column)
      例如:df[pandas.isnull(df.title)]
    • 字符匹配
      str.contains(patten,na=False)
      例如:df[df.title.str.contains('台电',na=False)]
    • 逻辑运算
      与& 或| 非not
      例如:df[(df.comments>=1000)&(df.comments<=10000)]
      与上面的运算范围df[df.commentsbetween(1000,100000];等价
from pandas import read_csv
df = read_csv('/Users/cuiwenhao/Data_xxx/4.8/data.csv',sep='|')
print(df)
#单条件
df[df.comments>10000]

    id  comments    title
0   1197453 10071   华为(HUAWEI)荣耀平板 Wifi版 8英寸平板电脑(高通骁龙四核 1280×800 1G/8G 4800mAh)银色
1   1192330 6879    小米(MI)7.9英寸平板 WIFI 64GB(NVIDIA Tegra K1 2.2GHz 2G 64G 2048*1536视网膜屏 800W)白色
2   1225995 2218    小米(MI)7.9英寸平板 WIFI 16GB(NVIDIA Tegra K1 2.2GHz 2G 16G 2048*1536视网膜屏 800W)浅绿色
3   1308557 1605    华为(HUAWEI)荣耀平板优享版 Wifi 8英寸平板电脑(高通骁龙 64位四核1280×800 2G/16G 4800mAh)香槟金
4   1185287 836 微软(Microsoft) Surface Pro 3(中文版 Intel i5 128G存储 4G内存)MQ2-00014
5   1197789 2084    
6   996957  11123   Apple iPad Air MD785CH 9.7英寸平板电脑 (16G WiFi版)深空灰色
7   1150612 5857    台电(Teclast) P98 3G八核 9.7英寸平板电脑(MTK8392 Air视网膜屏1300W摄像头 2G/16GB 超薄7.4mm)前白后金
8   1285329 2482    台电(Teclast)X98 Air 3G 双系统版 9.7英寸平板电脑(正版Win8+安卓 3G通话 Intel 3736F Air屏)前白后灰

#多条件
df[df.comments.between(1000, 10000)]

#过滤空值所在行
df[pandas.isnull(df.title)]

#根据关键字过滤
df[df.title.str.contains('台电', na=False)]

#~为取反
df[~df.title.str.contains('台电', na=False)]

#组合逻辑条件
df[(df.comments>=1000) & (df.comments<=10000)]

你可能感兴趣的:(数据处理1(重复值、缺失值、字段抽取\拆分、记录抽取))