天天看点

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

继续阅读