#%%
# CY3761 | 2022-01-06 16:32
#%%
# 套用模版后记住先执行-全部运行
#%%
# 导入项
import numpy as np
import pandas as pd
#%%
def printData(o):
oItems = dict(dtype=None,dtypes=None,shape=None,size=None,index=None,columns=None)
for (k,v) in oItems.items():
try:
oItems[k] = eval(f'o.{k}')
except (Exception, BaseException) as e:
pass
print(type(o), '\n', oItems)
#%% md
# 数据转换之变形金刚
#%% md
## 数据转换
#%% md
### 轴和元素替换
#%%
rMin = 65
rChr = [chr(_) for _ in range(rMin, rMin+26)]
np.array(rChr)
#%%
a01 = pd.DataFrame(
np.random.randint(0, 10, (10, 3)),
rChr[:10],
tuple('PTK')
)
a01
#%%
# 定义一堆空数据
a01.iloc[4,2] = None # 先行后列 数值内容 None NaN 都是 NaN
a01
#%%
# 重命名索引
a01.rename(index=dict(A='AA', B='BB'), columns=dict(P='人工智能')) # inplace默认False= 返回新数据
#%%
# 替换值
a01.replace(3, -3) # 元素值如果是3 改为 -3
#%%
# 多个替换
a01.replace([0,4], 16) # 但凡是 0 或 4 替换成16
#%%
# 根据字典键值进行替换
a01.replace({0: 512, np.NaN: 9999})
#%%
# 指定范围替换
a01.replace({'P':2}, 666) # P列的值是2, 替换为666
#%% md
### map
#%%
a01
#%%
# map
a01.K.map({1:'H',5:'W',7:'A'}) # 值为 1改为H 5改为W 7改为A 其余 NaN
#%%
# 如果需要其他不变
a01.K.replace({1:'H',5:'W',7:'A'})
#%%
def convert(x):
items = {1:'H',5:'W',7:'A',np.NaN:'Z'} # NaN 无法转换
print(x, type(x))
if x in items:
return items.get(x)
elif x is np.NaN or str(x) == 'nan': # 不行 后面的才可以
return items.get(np.NaN) # 这样硬写死处理
return x
a01.K.map(convert) # 使用函数传入进行过滤 map实现 不在范围就不改变
#%%
np.NaN == np.NaN, np.NaN is np.NaN # 奇怪 值不相同, 内存地址却相同
#%%
# 使用隐式函数 匿名函数
a01.P.map(lambda x:True if x > 5 else False)
#%% md
### apply 既支持 Series,也支持 DataFrame
#%%
a02 = pd.DataFrame(np.random.randint(0, 101, (30, 3)), columns=tuple('PME'))
a02
#%%
a02.P # 获取 P 学科这一列数据 (有大有小)
#%%
# 给予分数进行评级
def convert(x):
items = {80:'优秀', 60:'及格'}
for _ in items:
if x >= _:
return items.get(_)
else:
return '不及格'
pass
b02 = a02.P.apply(convert) # 自己定义
b02
#%%
# 把数据插入到原来数据中
#%%
# 求所有的成绩等级
for _ in a02.columns:
b02 = a02[_].apply(convert) # 进行计算各科成绩等级
a02.insert(list(a02.columns).index(_) + 1, _ + '科成绩等级', b02) # 插入位置 插入标题 插入数据 | 由于每个循环都会增加字段 index获取每个循环都需要更新
a02
#%%
PY-pandas | 数据转换之变形金刚
最新推荐文章于 2024-06-13 23:09:11 发布