pandas基础
list转化为series
data = [1,2,3,4,5,6] array = np.array(data)
array_str = array.astype('str') #数据类型转换为字符串 print(array)
series转化为list
ori_cent_date = pd.read_excel('/tmp/核心数据库.xlsx')
ip_list = ori_cent_date.IP.tolist()
创建Series
a = [1,2,3,4,5,6] b = range(1,7) a_series = pd.Series(a,index = ['A','B','C','D','E','F']) b_series = pd.Series(b,index = ['A','B','C','D','E','F'])
字典类型可以直接创建Series
# 字典可以直接创建Series d = { 'qinlu':'handsome', 'lulu':'graceful' } s2 = pd.Series(d) print(s2) print('-----------------------') # Series有自动对齐索引功能,NaN表示空,缺失 s3 = pd.Series(d,index=['qinlu','lulu','qinqin']) print(s3)
DataFrame也可以看做一个字典,只不过它的值为一个序列
# DataFrame也可以看做一个字典,只不过它的值为一个序列 import pandas as pd dict = { 'name':['张三','李四','王五','金锁'], 'sex':['男','男','男','女'], 'age':[18,19,20,18] } df = pd.DataFrame(dict) print(df) print(df.info()) # 转换数据类型astype print(df.age.astype('str'))
行和列操作
import pandas as pd dict = { 'name':['张三','李四','王五','金锁'], 'sex':['男','男','男','女'], 'age':[18,19,20,18] } df = pd.DataFrame(dict) # 读取列 print(df['age']) print(df['name']) print(df[['name','age']]) # 读取行(切片) print(df[0:3]) # 修改列的值 df['age'] = 18 # df.age = 18 print(df) df['age'] = [18,19,20,19] # df.age = [18,19,20,19] print(df) # 增加一列 df['country'] = 'chana' print(df) # 获取索引信息 print(df.index)
数据筛选
import pandas as pd dict = { 'name':['张三','李四','王五','金锁'], 'sex':['男','男','男','女'], 'age':[18,19,20,18] } df = pd.DataFrame(dict) # 切片 a = df[['age','sex']] print(a) # 筛选sex为男, b = df[df.sex == '男'] print(b) # 筛选年龄大于等于19 c = df[df.age >= 19] print(c) #筛选性别为女,年龄小于19 d = df[(df.sex == '女') & (df.age < 19)] print(d) 能进行布尔判断 e = df.sex == '男' print(e) # 当逻辑条件复杂时,这种写法并不优雅,比如性别为男,且年龄在18岁,以及性别为女,且年龄在18岁以上的两类人群,这种过滤条件就比较复杂了。pandas中可以用query函数以类SQL语言执行查询。 f = df.query('(age == 19 and sex == "女") or (age >= 19 and sex == "男")') print(f) # 利用df.age直接运算 df.age = df.age + 1 print(df)
排序
import pandas as pd file = '/Users/soymilk/微云同步助手(296672942)/OY/study_happy/python_pandas/pandas_excel/data/List.xlsx' df = pd.read_excel(file,index_col='ID') df = df.sort_values(by=['Worthy','Price'],ascending=[False,False]) # 按值进行排序 print(df)
按照条件筛选
''' 筛选 ''' import pandas as pd def b1830(a): return 18 <=a < 30 def b85(b): return 85 < b file = '/tmp/Students.xlsx' df = pd.read_excel(file,index_col='ID') df = df.loc[df.Age.apply(b1830)].loc[df.Score.apply(b85)] print(df) ''' 简化版 ''' # file = '/tmp/Students.xlsx' # df = pd.read_excel(file,index_col='ID') # df = df.loc[df.Age.apply(lambda a: 18<=a<30)].loc[df.Score.apply(lambda b: 85<b)] # print(df) ''' 符合逻辑的版本 ''' # file = '/tmp/Students.xlsx' # df = pd.read_excel(file,index_col='ID') # df_filter = df[(18<=df.Age) & (df.Age<30) & (85<df.Score)] # print(df_filter)
查看DataFrame属性,数据类型等
print(type(df)) # 查看df的类型 print(df.info()) # 有多少数据类型,整个DataFrame占多少字节 print(df.dtypes) # 查看DataFrame各个列的数据类型
深刻理解DataFrame
import pandas as pd import numpy as np # 字典形式 data1 = {'地区':['中国','巴西'],'变电站-x':['变电站-A','变电站-B']} df1 = pd.DataFrame(data1,index=['A','B']) print(df1) print('----------------') # 序列形式 data2 = [['中国','变电站-A'],['巴西','变电站-B']] df2 = pd.DataFrame(data2,index=['A','B'],columns=['地区','变电站-x']) print(df2)
DataFrame修改列名,修改index
修改列名
#直接修改:缺点必须写明每一列,不然会报错 a.columns = ['A','B','C'] Out[4]: A B C 0 1 4 7 1 2 5 8 2 3 6 9 ##推荐方法 #每个列名都修改 a.rename(columns={'a':'A', 'b':'B', 'c':'C'}, inplace = True) Out[7]: A B C 0 1 4 7 1 2 5 8 2 3 6 9 #修改指定列名 a.rename(columns={'a':'A', 'c':'C'}, inplace = True) Out[14]: A b C 0 1 4 7 1 2 5 8 2 3 6 9 修改index a.set_index('A')
利用iloc选取列和行
# 选取第2列,选取第2-3列(1:3不包括3,即不包括第4列) df = df[:,1] df = df[:,1:3] # 选取第2行,选取第2-3行(1:3不包括3,即不包括第4行) df = df[1,:] df = df[1:3,:]
删除包含某个字符串的行
# 通过取反获取不包含精准字符串“2000吨”的结果 df=df[~df['产量'].isin(["2000吨"])] # 通过取反获取不包含字符串“吨”的结果 df=df[~df['产量'].str.contains('吨')]
数据类型转换
# 数据类型转化成字符串 df['2016'] = df['2016'].astype('str') # 数据类型转化为整型 df['2016'] = df['2016'].astype('int') # 数据类型转化为浮点型 df['2016'] = df['2016'].astype('float')
删除列
# 删除列(需要赋值) df = df.drop(columns=['产量','平均产量']) # 直接删除 df.drop(columns=['产量','平均产量'],inplace=True) # 直接删除(只能删除一列) del df['产量']
参考文章:
条件筛选数据:https://www.cnblogs.com/nxf-rabbit75/p/10105271.html