第十二节 pandas变量变换

import pandas as pd
import numpy as np
import math
pd.options.display.max_rows = 10  # 设置显示行数

df1 = pd.read_csv(r'E:\anacondatest\PythonData\高校信息.csv', encoding='gbk', index_col='学校名称')

# 添加一列值为1的列
df1['cons'] = 1

# 通过原变量列经过四则运算生成新列
df1['new'] = df1.总分 + df1.名次 + 1
df1['new1'] = np.sqrt(df1.总分)  # numpy支持serial数据格式运算,math库中的sqrt方法就不行,如果使用math库,要和apply连用才可以

# 基于一个原变量做函数运算
df1['new3'] = df1.总分.apply(math.sqrt)
df1['new3'] = df1.总分.apply(np.sqrt)

# 对所有单元格进行相同的函数运算
df2 = df1[['名次', '总分']].applymap(math.sqrt)  # 返回
'''
               名次         总分
学校名称                        
北京大学     1.000000  10.000000
清华大学     1.414214   9.924717
'''

# 不改变原来的数据框,生成新的数据框
df3 = df1.assign(new4 = df1.总分.apply(math.sqrt))

# 在指定位置插入变量列,该方法直接改变原来的数据框
df1.insert(1, 'new5', 'cons')  # 1表示列索引,new5变量列名字,cons新列的值

# 修改/替换变量值,本质是如何指定到单元格的问题,只要能准确找到单元格地址,就能准确替换
# print(df1.所在城市.isin(['上海']))
'''
学校名称
北京大学      False
清华大学      False
'''
# print(df1.head())
df1.所在城市[70] = '上海'
df1['所在城市'][70] = '上海'
df1.loc[70, '所在城市'] = '上海'

# 对应数值的替换
df1.所在城市.replace('上海', '魔都', inplace=False)  # 将所在城市的上海全部替换成魔都
df1.所在城市.replace(['北京', '魔都'], ['帝都', '上海'], inplace=False)
df1.所在城市.replace({'帝都':'北京', '上海':'魔都'}, inplace=False)

# 指定数值替换
df1.总分.iloc[0:3] = 10  # 总分列1-3行全部数据替换成10
df1.iloc[0:3, '总分'] = 10  # 总分列1-3行全部数据替换成10
df1.loc[df1.名次<10, '总分'] =20  # 用index引出相应的索引
df1.总分[df1.名次<10] = 25
df1.loc[df1.query("名次<10 and 类型=='综合'").index, '总分'] = 10  # query语句可以用于index定位,然后实现数值替换,但是无法直接实现数值替换,因为query生成的是数据的copy而不是数据地址的引用

# 哑变量变换
print(df1.head())
pd.get_dummies(df2.类型, prefix='pre', prefix_sep='-')  # prefix哑变量列名称前缀,prefix_sep前缀和序号直接的连接字符
pd.get_dummies(df1, columns=['类型'])  # columns希望转换的原始列名,不指定转换所有符合条件的

# 数值变量分段,bins具体分段设定,right每段是否包括右侧边界,include_lowest第一段是否包括最左侧的值,需要和right参数配合使用
df1['new6'] = pd.cut(df1.名次, bins=[1, 3, 7], right=True, include_lowest=True)

猜你喜欢

转载自www.cnblogs.com/kogmaw/p/12563074.html