PY-pandas | 数据筛选与赋值

#%%
# CY3761 | 2022-01-05 12:13
#%%
# 套用模版后记住先执行-全部运行
#%%
# 导入项
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
### 赋值操作
#%%
#  data, index, columns, dtype
a01 = pd.DataFrame(
    # low, high, size, dtype
    np.random.randint(0, 50, (120, 3)),
    None,
    tuple('PME')
)
a01
#%%
# 增加一列数据 向后增加
a01['PH'] = np.random.randint(0, 50, 120)  # 增加一列赋值需要使用中括号 不能用点
a01
#%%
# P 学科都增加10分
a01.P += 10  # 这个可以用点
a01
#%%
# 特定修改
# 索引2 M学科改为 100
a01.loc[2].M = 100
a01
#%%
a01.M[2] = 150
a01
#%%
a01.loc[2,'M'] = 200
a01
#%%
# 多个调整
a01.M[2,3] = 151
a01
#%%
a01.loc[(2,3),'M'] = 161
a01
#%%
# 多个学科, 多个学生
# a01[['M','E']][[2,3]] = 152  # 不能这样
a01.loc[(2,3),('M', 'P')] = 152  # 仅能 loc iloc
a01
#%%
# 条件
cond_01 = a01.M < 10
a01[cond_01] -= 10  # 通过条件就是赋值整个数据
#%%
a01[cond_01]  # 元数据并没改变 如果上面不进行赋值 则不会改变元数值 无论是否 loc
#%%
a01.loc[cond_01] -= 10
#%%
a01[cond_01]  # 这个也是没有改变 -= 才会发送变化
#%% md
## 数据集成
#%% md
### concat操作
#%%
# 数据串联
cMin = 65
a02 = np.array([chr(_) for _ in range(cMin, cMin+26)]) # 字母表
a02
#%%
b02 = pd.DataFrame(
    np.random.randint(0, 150, (10, 3)),
    a02[:10],
    tuple('PTK')
)
b02
#%%
c02 = pd.DataFrame(
    np.random.randint(0, 150, (10, 3)),
    a02[10:10+10],
    tuple('PTK')
)
c02
#%%
d02 = pd.DataFrame(
    np.random.randint(0, 150, (10, 3)),
    a02[:10],
    tuple('ROV')
)
d02
#%%
pd.concat(objs=(b02, c02), axis=0)  # 行串联(垂直) 向下追加 需要关键字传参
#%%
b02.append(c02)  # 返回新数据 不会修改原值 同样具有上面 | 行串联(垂直) 向下追加 效果
#%%
b02  # 并没变化
#%%
pd.concat(objs=(b02, d02), axis=1)  # 列串联(水平) 向右追加 效果
#%% md
### insert操作
#%%
display(b02, c02, d02)  # 同样三组数据
#%%
# 假设想在 T 与 K 之间插入列数据
# self, loc, column, value, allow_duplicate | 插入位置
e02 = b02.copy()
e02.insert(2, 'Q', 150)  # 插入1列 数据均为 150 会改变当前数据
e02
#%%
print(e02.columns)
index_02 =  list(e02.columns).index('P')  # 找到插入当前位置 >= 0
print(index_02)
index_02 += 1 # 在这个位置后面插入
#%%
e02.insert(index_02, 'R', np.random.randint(0, 151, e02.shape[0])) # P 与 T 之间 插入不同的值
#%%
e02
#%%
index_02 =  list(e02.columns).index('T')  # 找到插入当前位置 >= 0
index_02 += 1 # 在这个位置后面插入
e02.insert(index_02, 'X', np.random.randint(0, 151, e02.shape[0])) # T 后面 插入不同的值
e02
#%% md
### 通过 join (SQL风格: merge操作)
#%%
a03 = pd.DataFrame(dict(name=tuple('SDBE'), weight=(70,55,75,65)))
b03 = pd.DataFrame(dict(name=tuple('SDBC'), height=(172,170,170,166)))
c03 = pd.DataFrame(dict(名字=tuple('SDBC'), height=(173,171,171,167)))

display(a03, b03, c03)
#%%
# 根据相同 name 将 表数据合并
# inner 合并交集(不同的相互合并, 相同的保留一份) 不能关联的进行舍去
pd.merge(a03, b03, how='inner', on='name')
#%%
# 不同字段名合并
# outer 合并并集
# 把2个数据都合并起来 不管是否相同 但出现一边没有数据时 返回 NaN
pd.merge(a03, c03, how='outer', left_on='name', right_on='名字')
#%%
# 交集合并 不同字段名
pd.merge(a03, c03, left_on='name', right_on='名字')
#%%
# 三科成绩
a04 = pd.DataFrame(
    np.random.randint(0, 151, (10, 3)),
    a02[:10],
    tuple('PKT')
)
# 计算平均分
b04 = pd.DataFrame(
    # 水平 按每个学生
    a04.mean(1).round(2),
    None,
    ('SVG',)
)

display(a04, b04)
#%%
pd.merge(a04, b04, left_index=True, right_index=True)  # left_index right_index 默认 False
#%%
# 每个科的平均分
a04.mean().round(2)
#%%

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CY3761

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值