如果你觉得内容对你有帮助,请在 GitHub 上点个 star 吧!

2.4. 数据处理#

数据处理工作包括处理重复值、缺失值和异常值,生成新的列或者行等。

Hide code cell content
import os
import urllib.request
import zipfile
import pandas as pd

folder_path = os.path.join(os.getcwd(), "../data/pwt")
download_url = "https://www.rug.nl/ggdc/docs/pwt70_06032011version.zip"
file_name = download_url.split("/")[-1]
zip_file_path = os.path.join(folder_path, file_name)
if not os.path.exists(folder_path):
    os.makedirs(folder_path)

if not os.path.exists(zip_file_path):
    urllib.request.urlretrieve(download_url, zip_file_path)
    with zipfile.ZipFile(zip_file_path, 'r') as zip_ref:
        zip_ref.extractall(folder_path)

df = pd.read_csv(os.path.join(folder_path, "pwt70_w_country_names.csv"))

处理重复值#

检测数据集的记录是否存在重复,可以使用 .duplicated() 函数进行验证,但是该函数返回的是数据集每一行的检测结果,即 n 行数据会返回 n 个布尔值。为了能够得到最直接的结果,可以使用 any 函数。该函数表示的是在多个条件判断中,只要有一个条件为 True,则 any 返回的结果为 True。

any(df.duplicated())
False

如果有重复项,可以通过 .drop_duplicated() 删除。该函数有 inplace 参数,设置为 True 表示直接在原始数据集上做操作:df.drop_duplicated(inplace = True)

处理缺失值#

缺失值是指数据集中的某些观测存在遗漏。数据缺失可能有两方面原因:一方面是人为原因,如记录过程中的遗漏、个人隐私而不愿意透露等;另一方面是机器或设备的故障所导致。

可以使用 .isna().isnull() 函数查看缺失值。这两个函数返回 DataFrame 每个元素是否有缺失值,如果有缺失值,比如 N/A 或null,则返回 True;否则返回 False。

例如:通过 .sum() 查看每一列的空缺值计数。

df.isnull().sum()
country              0
isocode              0
year                 0
POP                  2
XRAT              1237
Currency_Unit     1237
ppp               2655
tcgdp             2655
cgdp              2655
cgdp2             2655
cda2              2655
cc                2655
cg                2655
ci                2655
p                 2655
p2                2655
pc                2655
pg                2655
pi                2655
openc             2655
cgnp              3095
y                 2655
y2                2655
rgdpl             2675
rgdpl2            2675
rgdpch            2675
kc                2675
kg                2675
ki                2675
openk             2675
rgdpeqa           2845
rgdpwok           3223
rgdpl2wok         3223
rgdpl2pe         10555
rgdpl2te          6001
rgdpl2th          9126
rgdptt            2655
dtype: int64

一般而言,遇到缺失值时,可以采用三种方法处理,分别是删除法、替换法或插补法。

删除法是指当缺失的观测比例非常低(如 5% 以内),直接删除存在缺失的观测,或者当某些变量的缺失比例非常高时(如 85% 以上),直接删除这些缺失的变量。

可以使用 .dropna() 函数删除有缺失值的行或列。具体形式:df.dropna(axis=0, how='any', inplace=False)

这个函数有参数 axisaxis 用来指定要删除的轴。axis=0 表示删除行(默认),axis=1 表示删除列。how 用来指定删除的条件。how='any' 表示删除包含任何缺失值的行(默认),how='all' 表示只删除所有值都是缺失值的行。inplace 用于指定是否在原始 DataFrame 上进行修改,默认为 False,表示不修改原始 DataFrame,而是返回一个新的 DataFrame

例如,删除包含任何缺失值的行。

ddf = df.dropna()

.fillna() 函数填补数据框中的缺失值。例如,将 DataFrame 中的缺失值用 0 填充。

fill_zero_df = df.fillna(0)

对于时间类型的数据集,可以用 .fillna()method 参数,可以接受 ffillbfill 两种值,分别代表前向填充和后向填充,使得数据前后具有连贯性,而一般的独立性样本并不适用该函数。(前向填充是指用缺失值的前一个值替换,而后向填充是指用缺失值的后一个值替换。)

Apply 函数#

.apply() 函数也是一个 pandas 中常用的函数。它可以对每行 / 列(也可以对基于切片选择特定的列或行)应用一个函数并返回一个 Series。该函数可以是一些内置函数,如 max 函数、lambda 函数或自定义函数。

  • max 函数

例如,返回 year, POP, XRAT, tcgdp, cc, cg 列的最大值(当该列有空值时,无法计算最大值,则返回空值)。

df[['year', 'POP', 'XRAT', 'tcgdp', 'cc', 'cg']].apply(max)
year        2009.0
POP      1323592.0
XRAT           NaN
tcgdp          NaN
cc             NaN
cg             NaN
dtype: float64
  • lambda 函数,形式为 lambda arguments: expression

lambda 函数是一种没有函数名,但是可以被调用执行的函数。换句话说,lambda 函数不需要用 def func_name() 来定义函数名,而是直接定义函数体中的计算部分。关于函数体部分,arguments 是参数列表,可以指定一个或多个参数,就像定义普通函数一样;expression 是一个表达式,定义了 lambda 函数的计算逻辑,通常包括使用参数执行哪些计算,并返回计算结果。lambda 函数通常用于一次性的、简单的操作。

例如,对每一行返回数据本身,不做任何其他操作:

df.apply(lambda row: row, axis=1)
country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt
0 Afghanistan AFG 1950 8150.368 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Afghanistan AFG 1951 8284.473 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 Afghanistan AFG 1952 8425.333 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 Afghanistan AFG 1953 8573.217 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Afghanistan AFG 1954 8728.408 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 9.376272 89.399427 214.739197 418.970867 418.970867 NaN 390.907086 NaN 169.097559
11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 14.986823 81.697014 217.543648 424.754259 407.262097 NaN 377.352394 NaN 179.368685
11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 15.787322 84.483374 202.707080 396.486201 376.163064 NaN 345.764991 NaN 173.113448
11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 13.444449 85.117130 174.178806 343.159758 332.649861 NaN 302.945712 NaN 142.329054
11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 14.743667 83.749534 182.613004 NaN NaN NaN 314.171069 NaN 151.435285

11400 rows × 37 columns

在这个例子中,apply 有个参数为 axisaxis = 1 设置函数对每一行操作;axis = 0 设置函数对每一列操作;默认 axis = 0

例:和 .loc[] 一起使用,进行更高级的数据切片。.apply() 返回对每一行做条件判断的一系列布尔值,以 [] 操作选择部分列。下面的选择条件为:如果 country 列属于特定国家,且 POP > 40000;如果 country 列不属于特定国家,且 POP < 20000

complexCondition = df.apply(
lambda row: row.POP > 40000 if row.country in ['Argentina', 'India', 'South Africa'] else row.POP < 20000,
axis=1), ['country', 'year', 'POP', 'XRAT', 'tcgdp']
complexCondition
(0        True
 1        True
 2        True
 3        True
 4        True
          ... 
 11395    True
 11396    True
 11397    True
 11398    True
 11399    True
 Length: 11400, dtype: bool,
 ['country', 'year', 'POP', 'XRAT', 'tcgdp'])
df.loc[complexCondition]
country year POP XRAT tcgdp
0 Afghanistan 1950 8150.368 NaN NaN
1 Afghanistan 1951 8284.473 NaN NaN
2 Afghanistan 1952 8425.333 NaN NaN
3 Afghanistan 1953 8573.217 NaN NaN
4 Afghanistan 1954 8728.408 NaN NaN
... ... ... ... ... ...
11395 Zimbabwe 2005 11639.470 2.236364e+01 1968.205961
11396 Zimbabwe 2006 11544.326 1.643606e+02 2132.305773
11397 Zimbabwe 2007 11443.187 9.675781e+03 2107.937100
11398 Zimbabwe 2008 11350.000 6.715424e+09 1772.209867
11399 Zimbabwe 2009 11383.000 1.400000e+17 1906.049843

9231 rows × 5 columns

则返回符合条件的行和列。

更改 DataFrame#

更改 DataFrame 的部分值(行、列)在数据分析过程中十分重要。

  • .where() 函数保留行,并用其他值替代其余行。

例:找出 POP 大于 20000 的行,保留这些行,其余部分用 other 替代,other 参数可以是任意值,比如 0 、”hello” 等。

df.where(df.POP > 20000, other=False)
country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt
0 False False False False False False False False False False ... False False False False False False False False False False
1 False False False False False False False False False False ... False False False False False False False False False False
2 False False False False False False False False False False ... False False False False False False False False False False
3 False False False False False False False False False False ... False False False False False False False False False False
4 False False False False False False False False False False ... False False False False False False False False False False
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11395 False False False False False False False False False False ... False False False False False False False False False False
11396 False False False False False False False False False False ... False False False False False False False False False False
11397 False False False False False False False False False False ... False False False False False False False False False False
11398 False False False False False False False False False False ... False False False False False False False False False False
11399 False False False False False False False False False False ... False False False False False False False False False False

11400 rows × 37 columns

  • .loc[] 函数指定想修改的列,并赋值。

例:找出 cg 列的最大值,赋值为 1 。

df.loc[df.cg == max(df.cg), 'cg'] = 1
  • .apply() 函数,根据自定义函数修改行和列。

例:将 POP 小于 10000 的修改为 1, 将 XRAT 缩小十倍。

def update_row(row):
  # modify POP
  row.POP = 1 if row.POP<= 10000 else row.POP

  # modify XRAT
  row.XRAT = row.XRAT / 10
  return row

df.apply(update_row, axis=1)
country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt
0 Afghanistan AFG 1950 1.000 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Afghanistan AFG 1951 1.000 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 Afghanistan AFG 1952 1.000 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 Afghanistan AFG 1953 1.000 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Afghanistan AFG 1954 1.000 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11395 Zimbabwe ZWE 2005 11639.470 2.236364e+00 Zimbabwe Dollar 39.482829 1968.205961 169.097559 184.183929 ... 6.995770 9.376272 89.399427 214.739197 418.970867 418.970867 NaN 390.907086 NaN 169.097559
11396 Zimbabwe ZWE 2006 11544.326 1.643606e+01 Zimbabwe Dollar 384.899651 2132.305773 184.705956 192.953943 ... 7.648020 14.986823 81.697014 217.543648 424.754259 407.262097 NaN 377.352394 NaN 179.368685
11397 Zimbabwe ZWE 2007 11443.187 9.675781e+02 Zimbabwe Dollar 38583.323960 2107.937100 184.208918 198.215361 ... 8.387106 15.787322 84.483374 202.707080 396.486201 376.163064 NaN 345.764991 NaN 173.113448
11398 Zimbabwe ZWE 2008 11350.000 6.715424e+08 Zimbabwe Dollar 38723.957740 1772.209867 156.141839 162.112294 ... 7.685312 13.444449 85.117130 174.178806 343.159758 332.649861 NaN 302.945712 NaN 142.329054
11399 Zimbabwe ZWE 2009 11383.000 1.400000e+16 Zimbabwe Dollar 40289.958990 1906.049843 167.447056 174.419700 ... 7.905525 14.743667 83.749534 182.613004 NaN NaN NaN 314.171069 NaN 151.435285

11400 rows × 37 columns

  • .applymap() 函数,修改 DataFrame 中的所有单独元素。

例:将 DataFrame 中的数值型元素保留两位小数。

df.applymap(lambda x : round(x, 2) if type(x)!=str else x)
/var/folders/4n/v40br47s46ggrjm9bdm64lwh0000gn/T/ipykernel_18576/832431325.py:1: FutureWarning: DataFrame.applymap has been deprecated. Use DataFrame.map instead.
  df.applymap(lambda x : round(x, 2) if type(x)!=str else x)
country isocode year POP XRAT Currency_Unit ppp tcgdp cgdp cgdp2 ... kg ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt
0 Afghanistan AFG 1950 8150.37 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Afghanistan AFG 1951 8284.47 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 Afghanistan AFG 1952 8425.33 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 Afghanistan AFG 1953 8573.22 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Afghanistan AFG 1954 8728.41 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11395 Zimbabwe ZWE 2005 11639.47 2.236000e+01 Zimbabwe Dollar 39.48 1968.21 169.10 184.18 ... 7.00 9.38 89.40 214.74 418.97 418.97 NaN 390.91 NaN 169.10
11396 Zimbabwe ZWE 2006 11544.33 1.643600e+02 Zimbabwe Dollar 384.90 2132.31 184.71 192.95 ... 7.65 14.99 81.70 217.54 424.75 407.26 NaN 377.35 NaN 179.37
11397 Zimbabwe ZWE 2007 11443.19 9.675780e+03 Zimbabwe Dollar 38583.32 2107.94 184.21 198.22 ... 8.39 15.79 84.48 202.71 396.49 376.16 NaN 345.76 NaN 173.11
11398 Zimbabwe ZWE 2008 11350.00 6.715424e+09 Zimbabwe Dollar 38723.96 1772.21 156.14 162.11 ... 7.69 13.44 85.12 174.18 343.16 332.65 NaN 302.95 NaN 142.33
11399 Zimbabwe ZWE 2009 11383.00 1.400000e+17 Zimbabwe Dollar 40289.96 1906.05 167.45 174.42 ... 7.91 14.74 83.75 182.61 NaN NaN NaN 314.17 NaN 151.44

11400 rows × 37 columns

  • del 函数删除指定列。

例:删除 ppp 列。

del df['ppp']
  • df['new_column'] = values 增加新列。

例:增加一列 GDP percap 显示人均 GDP。

df['GDP percap'] = df['tcgdp'] / df['POP']
  • astype() 更改变量数据类型

例:将 country 列改为字符串类型。

df.country = df.country.astype('str')

数据排序#

在很多分析任务中,需要按照某个或某些指标对数据进行排序。pandas 在排序时,根据排序的对象不同可细分为 sort_valuessort_index, 与其字面意义相一致,分别代表了对值进行排序和对索引 index 进行排序。

  • .sort_values() 函数,按照指定列排序。

形如 .sort_values(by='column1', ascending = True/False)ascending 参数设置为 True 表示升序,False 为降序。例如按照 POP 列升序排列:

df = df.sort_values(by='POP', ascending = True)
df
country isocode year POP XRAT Currency_Unit tcgdp cgdp cgdp2 cda2 ... ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt GDP percap
7740 Palau PLW 1950 7.251 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7741 Palau PLW 1951 7.448 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7742 Palau PLW 1952 7.651 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7743 Palau PLW 1953 7.859 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7744 Palau PLW 1954 8.073 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
2158 China Version 1 CHN 2008 1317066.000 6.95 Yuan Renminbi 9.719402e+06 7379.586069 7529.397258 6747.223691 ... 42.862836 68.760068 7132.315550 10938.84514 10929.28222 NaN 10937.76354 NaN 6635.526673 7.379586
2219 China Version 2 CH2 2009 1323592.000 6.83 Yuan Renminbi 1.134246e+07 8569.456643 9227.187296 8531.307128 ... 39.044203 61.240342 8247.646160 NaN NaN NaN 12658.65025 NaN 7747.331618 8.569457
2159 China Version 1 CHN 2009 1323592.000 6.83 Yuan Renminbi 1.073933e+07 8113.773410 8296.575690 7651.109254 ... 46.707842 58.579480 7782.385295 NaN NaN NaN 11914.32395 NaN 7314.930606 8.113773
10020 Tajikistan TJK 1950 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
10021 Tajikistan TJK 1951 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

11400 rows × 37 columns

也可以对多个列排序。例如按照 POP 列和 year 列降序排列。

df = df.sort_values(by=['POP','year'], ascending = False)
df
country isocode year POP XRAT Currency_Unit tcgdp cgdp cgdp2 cda2 ... ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt GDP percap
2219 China Version 2 CH2 2009 1323592.000 6.830000 Yuan Renminbi 1.134246e+07 8569.456643 9227.187296 8531.307128 ... 39.044203 61.240342 8247.646160 NaN NaN NaN 12658.65025 NaN 7747.331618 8.569457
2159 China Version 1 CHN 2009 1323592.000 6.830000 Yuan Renminbi 1.073933e+07 8113.773410 8296.575690 7651.109254 ... 46.707842 58.579480 7782.385295 NaN NaN NaN 11914.32395 NaN 7314.930606 8.113773
2218 China Version 2 CH2 2008 1317066.000 6.950000 Yuan Renminbi 1.055732e+07 8015.782984 8416.480345 7551.673672 ... 37.629450 69.883127 7777.945871 11929.04952 11929.04952 NaN 11938.30669 NaN 7233.090071 8.015783
2158 China Version 1 CHN 2008 1317066.000 6.950000 Yuan Renminbi 9.719402e+06 7379.586069 7529.397258 6747.223691 ... 42.862836 68.760068 7132.315550 10938.84514 10929.28222 NaN 10937.76354 NaN 6635.526673 7.379586
2217 China Version 2 CH2 2007 1310584.000 7.607532 Yuan Renminbi 9.407736e+06 7178.278054 7437.401920 6803.244389 ... 37.634047 69.245056 7357.713761 11290.43295 11290.43295 NaN 11288.33089 NaN 6690.086924 7.178278
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
7742 Palau PLW 1952 7.651 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7741 Palau PLW 1951 7.448 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
7740 Palau PLW 1950 7.251 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
10021 Tajikistan TJK 1951 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
10020 Tajikistan TJK 1950 NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

11400 rows × 37 columns

  • .sort_index() 函数,按照现有的 index 索引排序,index 通常为打印 DataFrame 时,最左侧没有任何列名的那一列。

df.sort_index()
country isocode year POP XRAT Currency_Unit tcgdp cgdp cgdp2 cda2 ... ki openk rgdpeqa rgdpwok rgdpl2wok rgdpl2pe rgdpl2te rgdpl2th rgdptt GDP percap
0 Afghanistan AFG 1950 8150.368 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
1 Afghanistan AFG 1951 8284.473 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
2 Afghanistan AFG 1952 8425.333 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
3 Afghanistan AFG 1953 8573.217 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
4 Afghanistan AFG 1954 8728.408 NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ... ...
11395 Zimbabwe ZWE 2005 11639.470 2.236364e+01 Zimbabwe Dollar 1968.205961 169.097559 184.183929 203.065978 ... 9.376272 89.399427 214.739197 418.970867 418.970867 NaN 390.907086 NaN 169.097559 0.169098
11396 Zimbabwe ZWE 2006 11544.326 1.643606e+02 Zimbabwe Dollar 2132.305773 184.705956 192.953943 201.489048 ... 14.986823 81.697014 217.543648 424.754259 407.262097 NaN 377.352394 NaN 179.368685 0.184706
11397 Zimbabwe ZWE 2007 11443.187 9.675781e+03 Zimbabwe Dollar 2107.937100 184.208918 198.215361 199.155404 ... 15.787322 84.483374 202.707080 396.486201 376.163064 NaN 345.764991 NaN 173.113448 0.184209
11398 Zimbabwe ZWE 2008 11350.000 6.715424e+09 Zimbabwe Dollar 1772.209867 156.141839 162.112294 170.488034 ... 13.444449 85.117130 174.178806 343.159758 332.649861 NaN 302.945712 NaN 142.329054 0.156142
11399 Zimbabwe ZWE 2009 11383.000 1.400000e+17 Zimbabwe Dollar 1906.049843 167.447056 174.419700 180.230237 ... 14.743667 83.749534 182.613004 NaN NaN NaN 314.171069 NaN 151.435285 0.167447

11400 rows × 37 columns