数据修改

在线刷题

检查 or 强化 Pandas 数据分析操作?👉在线体验「Pandas进阶修炼300题」

Note

本页面代码可以在线编辑、执行

本页数据说明

为了更好的介绍相关操作,本页面使用 东京奥运会奖牌数据 数据进行展开,你应该对数据字段、数值、类型等相关信息做一个大致了解!

import pandas as pd

df = pd.read_csv("东京奥运会奖牌数据.csv")

df.head()
排名 国家奥委会 Unnamed: 2 Unnamed: 3 Unnamed: 4 总分 按总数排名 国家奥委会代码
0 1 美国 39 41 33 113 1 USA
1 2 中国 38 32 18 88 2 CHN
2 3 日本 27 14 17 58 5 JPN
3 4 英国 22 21 22 65 4 GBR
4 5 ROC 20 28 23 71 3 ROC

数据修改

修改列名

将原 df 列名 Unnamed: 2Unnamed: 3Unnamed: 4 修改为 金牌数银牌数铜牌数

df.rename(columns={'Unnamed: 2':'金牌数',
                  'Unnamed: 3':'银牌数',
                  'Unnamed: 4':'铜牌数'},inplace=True) 

修改行索引

将第一列(排名)设置为索引

df.set_index("排名",inplace=True)

修改索引名

修改索引名为 金牌排名

df.rename_axis("金牌排名",inplace=True)

修改值

将 ROC(第一列第五行)修改为 俄奥委会

df.iloc[4,0] = '俄奥委会'

替换值(单值)

将金牌数列的数字 0 替换为

df['金牌数'].replace(0,'无',inplace=True)

替换值(多值)

同时替换

  • 替换为 缺失值

  • 将 0 替换为 None

注意:缺失值的 Nan 该怎么生成?

import numpy as np
df.replace(['无',0],[np.nan,'None'],inplace = True)

修改类型

金牌数 列类型修改为 int

df['金牌数'] = df['金牌数'].fillna('0').astype(int)

数据增加

新增列(固定值)

新增一列 比赛地点,值为 东京

df['比赛地点'] = '东京'

新增列(计算值)

新增一列 金银牌总数列,值为该国家金银牌总数

df = df.replace('None',0)
df['金银牌总数']  = df['金牌数']  + df['银牌数']

新增列(比较值)

新增一列 最多奖牌数量 列,值为该过金银牌数量种最多的一个奖牌数量

例如美国银牌最多,则为41,中国为38

df['最多奖牌数量'] = df.bfill(1)[["金牌数", "银牌数",'铜牌数']].max(1)

新增列(判断值)

新增一列 金牌大于30

如果一个国家的金牌数大于 30 则值为 是,反之为 否

df['金牌大于30']  = np.where(df['金牌数'] > 30, '是', '否')

增加多列

新增两列,分别是

  • 金铜牌总数(金牌数+铜牌数)

  • 银铜牌总数(银牌数+铜牌数)

df = df.assign(金铜牌总数=df.金牌数 + df.铜牌数,
         银铜牌总数=df.银牌数+df.铜牌数) 

新增列(引用变量)

新增一列金牌占比,为各国金牌数除以总金牌数(gold_sum)

gold_sum = df['金牌数'].sum()
df.eval(f'金牌占比 = 金牌数 / {gold_sum}',inplace=True)

新增行(末尾追加)

在 df 末尾追加一行,内容为 0,1,2,3… 一直到 df 的列长度

df1 = pd.DataFrame([[i for i in range(len(df.columns))]], columns=df.columns)
df_new = df.append(df1)

新增行(指定位置)

在第 2 行新增一行数据,即美国和中国之间。

数据内容同上一题

df1 = df.iloc[:1, :]
df2 = df.iloc[1:, :]
df3 = pd.DataFrame([[i for i in range(len(df.columns))]], columns=df.columns)
df_new = pd.concat([df1, df3, df2], ignore_index=True)

数据删除

删除指定行

删除 df 第一行

df.drop(1)
国家奥委会 金牌数 银牌数 铜牌数 总分 按总数排名 国家奥委会代码 比赛地点 金银牌总数 最多奖牌数量 金牌大于30 金铜牌总数 银铜牌总数 金牌占比
金牌排名
2 中国 38 32 18 88 2 CHN 东京 70 38.0 56 50 0.111765
3 日本 27 14 17 58 5 JPN 东京 41 27.0 44 31 0.079412
4 英国 22 21 22 65 4 GBR 东京 43 22.0 44 43 0.064706
5 俄奥委会 20 28 23 71 3 ROC 东京 48 28.0 43 51 0.058824
6 澳大利亚 17 7 22 46 6 AUS 东京 24 22.0 39 29 0.050000
... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
86 加纳 0 0 1 1 77 GHA 东京 0 1.0 1 1 0.000000
86 格林纳达 0 0 1 1 77 GRN 东京 0 1.0 1 1 0.000000
86 科威特 0 0 1 1 77 KUW 东京 0 1.0 1 1 0.000000
86 摩尔多瓦 0 0 1 1 77 MDA 东京 0 1.0 1 1 0.000000
86 叙利亚 0 0 1 1 77 SYR 东京 0 1.0 1 1 0.000000

92 rows × 14 columns

删除条件行

df.drop(df[df.金牌数<20].index)
国家奥委会 金牌数 银牌数 铜牌数 总分 按总数排名 国家奥委会代码 比赛地点 金银牌总数 最多奖牌数量 金牌大于30 金铜牌总数 银铜牌总数 金牌占比
金牌排名
1 美国 39 41 33 113 1 USA 东京 80 41.0 72 74 0.114706
2 中国 38 32 18 88 2 CHN 东京 70 38.0 56 50 0.111765
3 日本 27 14 17 58 5 JPN 东京 41 27.0 44 31 0.079412
4 英国 22 21 22 65 4 GBR 东京 43 22.0 44 43 0.064706
5 俄奥委会 20 28 23 71 3 ROC 东京 48 28.0 43 51 0.058824

删除列

删除刚刚新增的 比赛地点 列

df.drop(columns=['比赛地点'],inplace=True)

删除列(按列号)

删除 df7、8、9、10

df.drop(df.columns[[7,8,9,10]], axis=1,inplace=True)