我是靠谱客的博主 要减肥白云,这篇文章主要介绍Pandas 模糊查询与替换,现在分享给大家,希望可以做个参考。

主要用到的工具:Pandas 、fuzzywuzzy

Pandas:是基于numpy的一种工具,专门为分析大量数据而生,它包含大量的处理数据的函数和方法,

复制代码
1
以下为pandas中文API:

缩写和包导入

在这个速查手册中,我们使用如下缩写:

df:任意的Pandas DataFrame对象
s:任意的Pandas Series对象

同时我们需要做如下的引入:

import pandas as pd
import numpy as np

导入数据

  • 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.values[:,:-1]:返回除了最后一列的其他列的所以数据
  • df.query('[1, 2] not in c'): 返回c列中不包含1,2的其他数据集

数据清理

  • 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):批量重命名索引

数据处理:Filter、Sort和GroupBy

  • 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():返回每一列的标准差

  • 以下为数据处理的代码:

  • 复制代码
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    #!/usr/bin/python # -*- encoding: utf-8 import numpy as np import pandas as pd from fuzzywuzzy import fuzz from fuzzywuzzy import process def enum_row(row): print(row['state']) #对state这一列做枚举 def find_state_code(row): if row['state'] != 0: # 如果这个state的名字存在,就用state的名字与states列表中的值选择一个最接近的,如果小于80分,直接舍弃,大于80才返回 print(process.extractOne(row['state'], states, score_cutoff=80)) def capital(str): # 把str这个字符串,第一个字母大写,其余小写 return str.capitalize() def correct_state(row): if row['state'] != 0: # 如果这个state的名字存在,就用state的名字与states列表中的值选择一个最接近的,如果小于80分,直接舍弃,大于80才返回 state = process.extractOne(row['state'], states, score_cutoff=80) if state: # 如果为真,则找到了一个相关性的州名 state_name = state[0] # 选择用找到的这个州名数据 return ' '.join(map(capital, state_name.split(' '))) # 先按空格分开(有的州名中间有空格)单词,然后每个单词首字母大写 return row['state'] def fill_state_code(row): if row['state'] != 0: state = process.extractOne(row['state'], states, score_cutoff=80) if state: state_name = state[0] return state_to_code[state_name] # 返回这个州名的value,即缩写 return '' if __name__ == "__main__": pd.set_option('display.width', 200) # 横向最多显示多少个字符, 一般80不适合横向的屏幕,平时多用200. data = pd.read_excel('sales.xlsx', sheetname='sheet1', header=0) # 读取excel表 print('data.head() = n', data.head()) # 默认显示前五行 print('data.tail() = n', data.tail()) # tail显示后五行 print('data.dtypes = n', data.dtypes) # 数据类型 print('data.columns = n', data.columns)# 显示第一行行名 for c in data.columns: print(c, end=' ') # 输出第一行行名,中间以空格隔开 print() #相当于回车 data['total'] = data['Jan'] + data['Feb'] + data['Mar'] # Jan、Feb、Mar三列的值相加得到一个total print(data.head()) print(data['Jan'].sum()) # Jan这一列的值相加 print(data['Jan'].min()) # Jan这一列的最小值 print(data['Jan'].max()) # Jan这一列的最大值 print(data['Jan'].mean()) # Jan这一列的平均值 print('=============') # 添加一行 s1 = data[['Jan', 'Feb', 'Mar', 'total']].sum() # s1包含四个值,分别是这四列的和 print(s1) s2 = pd.DataFrame(data=s1) print(s2) print(s2.T) print(s2.T.reindex(columns=data.columns)) # 将s2进行转置输出 # 即: s = pd.DataFrame(data=data[['Jan', 'Feb', 'Mar', 'total']].sum()).T s = s.reindex(columns=data.columns, fill_value=0) print(s) data = data.append(s, ignore_index=True) data = data.rename(index={15:'Total'}) print(data.tail()) # apply的使用 print('==============apply的使用==========') data.apply(enum_row, axis=1) # axis=0时对每一列做变换,axis=1时对每一行做变换 # 事先写好以state为单位的编码字典 state_to_code = {"VERMONT": "VT", "GEORGIA": "GA", "IOWA": "IA", "Armed Forces Pacific": "AP", "GUAM": "GU", "KANSAS": "KS", "FLORIDA": "FL", "AMERICAN SAMOA": "AS", "NORTH CAROLINA": "NC", "HAWAII": "HI", "NEW YORK": "NY", "CALIFORNIA": "CA", "ALABAMA": "AL", "IDAHO": "ID", "FEDERATED STATES OF MICRONESIA": "FM", "Armed Forces Americas": "AA", "DELAWARE": "DE", "ALASKA": "AK", "ILLINOIS": "IL", "Armed Forces Africa": "AE", "SOUTH DAKOTA": "SD", "CONNECTICUT": "CT", "MONTANA": "MT", "MASSACHUSETTS": "MA", "PUERTO RICO": "PR", "Armed Forces Canada": "AE", "NEW HAMPSHIRE": "NH", "MARYLAND": "MD", "NEW MEXICO": "NM", "MISSISSIPPI": "MS", "TENNESSEE": "TN", "PALAU": "PW", "COLORADO": "CO", "Armed Forces Middle East": "AE", "NEW JERSEY": "NJ", "UTAH": "UT", "MICHIGAN": "MI", "WEST VIRGINIA": "WV", "WASHINGTON": "WA", "MINNESOTA": "MN", "OREGON": "OR", "VIRGINIA": "VA", "VIRGIN ISLANDS": "VI", "MARSHALL ISLANDS": "MH", "WYOMING": "WY", "OHIO": "OH", "SOUTH CAROLINA": "SC", "INDIANA": "IN", "NEVADA": "NV", "LOUISIANA": "LA", "NORTHERN MARIANA ISLANDS": "MP", "NEBRASKA": "NE", "ARIZONA": "AZ", "WISCONSIN": "WI", "NORTH DAKOTA": "ND", "Armed Forces Europe": "AE", "PENNSYLVANIA": "PA", "OKLAHOMA": "OK", "KENTUCKY": "KY", "RHODE ISLAND": "RI", "DISTRICT OF COLUMBIA": "DC", "ARKANSAS": "AR", "MISSOURI": "MO", "TEXAS": "TX", "MAINE": "ME"} states = list(state_to_code.keys()) # 把字典中的key拿出来放到states列表中 print(fuzz.ratio('Python Package', 'PythonPackage')) #计算Python Package与PythonPackage的相似度 print(process.extract('Mississippi', states)) # Mississippi与states中哪个最接近,并且列出相似比,不考虑大小写 print(process.extract('Mississipi', states, limit=1)) # limit=1代表只取最接近的一个 print(process.extractOne('Mississipi', states)) # extractOne代表只取最接近的一个 data.apply(find_state_code, axis=1) #apply表示对每一行(axis=1)的数据做find_state_code的变换 print('Before Correct State:n', data['state']) # 打印修改之前的state data['state'] = data.apply(correct_state, axis=1) # 检测每一行,并对其修改 print('After Correct State:n', data['state']) data.insert(5, 'State Code', np.nan) # 插入State Code这一列,为这一列州名的缩写 data['State Code'] = data.apply(fill_state_code, axis=1) print(data) # group by print('==============group by================') print(data.groupby('State Code')) print('All Columns:n') print(data.groupby('State Code').sum()) # 按州名缩写划分,并将同样州名的数字相加 print('Short Columns:n') print(data[['State Code', 'Jan', 'Feb', 'Mar', 'total']].groupby('State Code').sum()) # 写入文件 data.to_excel('sales_result.xls', sheet_name='Sheet1', index=False)

     

最后

以上就是要减肥白云最近收集整理的关于Pandas 模糊查询与替换的全部内容,更多相关Pandas内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(73)

评论列表共有 0 条评论

立即
投稿
返回
顶部