Pandas:添加修改、高级过滤

1、添加修改数据

Pandas 的数据修改是进行赋值,先把要修改的数据筛选出来,然后将同结构或者可解包的数据赋值给它:

修改数值

df.Q1 = [1, 3, 5, 7, 9] * 20 # 就会把值进行修改
df.loc[1:3, 'Q1':'Q2'] = 99 # 这个范围的数据会全变成 99
df.loc[df.name=='Arry', 'Q1':'Q4'] = [66,77,88,99] # 指定多列
df.loc[df.name.isin(['Arry', 'Ack']), 'Q1'] = (33, 44) # 修改列值

  • 将Q1分数<60的值改为60

替换数据

s.replace(0, 5) # 将列数据中 0 换为 5
df.replace(0, 5) # 将数据中所有 0 换为 5

df.replace([0, 1, 2, 3], 4) # 将 0-3 全换成 4
df.replace([0, 1, 2, 3], [4, 3, 2, 1]) # 对应修改

s.replace([1, 2], method='bfill') # 向下填充
df.replace({0: 10, 1: 100}) # 字典对应修改
df.replace({'Q1': 0, 'Q2': 5}, 100) # 指定字段的指定值修改为 100
df.replace({'Q1': {0: 100, 4: 400}}) # 指定列里指定值按指定的值替换

  • 将team中的A改为classA

填充空值

df.fillna(0) # 空全修改为 0

{‘backfill’, ‘bfill’, ‘pad’, ‘ffill’, None}, default None

df.fillna(method='ffill') # 都修改为它前一个值

values = {'A': 0, 'B': 1, 'C': 2, 'D': 3}
df.fillna(value=values) # 各列替换空值不同
df.fillna(value=values, limit=1) # 只替换第一个

修改索引名

df.rename(columns={"Q1": "a", "Q2": "b"}) # 对表头进行修改
df.rename(index={0: "x", 1: "y", 2: "z"}) # 对索引进行修改

增加列

df['foo'] = 100 # 增加一列 foo, 所有值都是 100

把所有为数字的加起来

df['total'] = df.select_dtypes(include=['int']).sum(1)
df['total'] = df.loc[:,'Q1':'Q4'].apply(lambda x: sum(x), axis='columns')

增加一列并赋值,不满足条件的为 NaN

df.loc[df.num >= 60, '成绩'] = '合格'
df.loc[df.num < 60, '成绩'] = '不合格'

插入列df.insert()

一般格式 df.insert(新列索引位, 名字, 数据)

df.insert(len(df.columns), 'Qx',pd.Series(np.random.randn(100), index=df.index))

指定列df.assign()

df.assign(Q5=[100]*100) # 新增加一列 Q5

添加一列,值为表达式结果 True or False

df.assign(tag=df.Q1>df.Q2)

True 为1 False 为 0

df.assign(tag=(df.Q1>df.Q2).astype(int))

映射文案

df.assign(tag=(df.Q1>60).map({True:'及格',False:'不及格'}))

增加多个

df.assign(Q8=lambda x: x.Q1*5,Q9=lambda x: x.Q8+1) # 注 Q8没生效不能直接 df.Q8

执行表达式df.eval()

  • 可以进行赋值定义一个新列:

    df['C1'] = df.eval('Q2 + Q3')
    df.eval('C2 = Q2 + Q3') # 计算
    a = df.Q1.mean()
    df.eval("C3 = Q3+@a") # 使用变量
    df.eval("C3 = Q2 > (Q3+@a)") # 加一个布尔值
    df.eval('C4 = name + team', inplace=True) # 立即生效

删除

df.pop('Q1') # 删除一列
s.pop(3) # 删除一个索引位
# 也可以把想要的列筛选出来赋值给 df 达到删除的目的

2、高级过滤

df.where(),df.mask()

np.where, 大于80是真,否则是假

np.where(s>80, True, False)
np.where(df.num>=60, '合格', '不合格')

s.mask(s > 90) # 符合条件的为 NaN
s.mask(s > 90, 0) # 符合条件的为 0


总结:

  • where:替换不满足条件的(显示满足的)
  • mask:替换满足条件的(显示不满足的)

3、参考文献

《深入浅出Pandas》

posted @ 2022-04-30 15:54  朝南烟  阅读(496)  评论(0)    收藏  举报
body { color: #000; background-color: #e6e6e6; font-family: "Helvetica Neue",Helvetica,Verdana,Arial,sans-serif; font-size: 12px; min-height: 101%; background: url(https://images.cnblogs.com/cnblogs_com/caolanying/1841633/o_2009041…ly1geq8oc9owbj21hc0u0th5.jpg) fixed; } #home { margin: 0 auto; opacity: 0.8; width: 65%; min-width: 1080px; background-color: #fff; padding: 30px; margin-top: 50px; margin-bottom: 50px; box-shadow: 0 2px 6px rgba(100, 100, 100, 0.3); }