Python 如何使用映射变量重新索引数据帧?

Python 如何使用映射变量重新索引数据帧?,python,pandas,indexing,dataframe,mapping,Python,Pandas,Indexing,Dataframe,Mapping,我有以下数据框: population GDP country United Kingdom 4.5m 10m Spain 3m 8m France 2m 6m 我在一个2列的数据框架中也有以下信息(很高兴能将其放入另一个数据结构中,如果这样做更有益的话,因为计划是它将在一个VARS文件中排序) county code Spai

我有以下数据框:

                  population   GDP
country
United Kingdom    4.5m         10m
Spain             3m           8m
France            2m           6m
我在一个2列的数据框架中也有以下信息(很高兴能将其放入另一个数据结构中,如果这样做更有益的话,因为计划是它将在一个VARS文件中排序)

county           code
Spain            es
France           fr
United Kingdom   uk
“映射”数据结构将按随机顺序排序,因为国家将在随机时间添加/删除

将数据框从国家名称重新索引到国家代码的最佳方法是什么

是否有一种智能解决方案也适用于其他列,例如,如果数据框在日期上编制了索引,但其中一列是
df['country']
,则您可以更改
df['country']
添加到其国家代码?最后,是否有第三个选项可以添加一个额外的列,该列是根据另一列中的国家名称选择正确代码的国家/代码?

我认为您可以使用,但它仅适用于
系列,因此需要。最后(在
熊猫
0.18.0
中新增):

它与dict映射相同:

d = df2.set_index('county').code.to_dict()
print (d)
{'France': 'fr', 'Spain': 'es', 'United Kingdom': 'uk'}

df1.index = df1.index.to_series().map(d)
df1 = df1.rename_axis('county')
#pandas bellow 0.18.0
#df1.index.name = 'county'
print (df1)
       population  GDP
county                
uk           4.5m  10m
es             3m   8m
fr             2m   6m
编辑:

省略了另一个解决方案,即so
至_系列

d = df2.set_index('county').code.to_dict()
print (d)
{'France': 'fr', 'Spain': 'es', 'United Kingdom': 'uk'}

df1.index = df1.index.map(d.get)
df1 = df1.rename_axis('county')
#pandas bellow 0.18.0
#df1.index.name = 'county'
print (df1)
       population  GDP
county                
uk           4.5m  10m
es             3m   8m
fr             2m   6m

以下是一些简单的方法来回答您的3个问题。更多详细信息如下:

1) 如何在单独的df中基于映射更改索引

使用创建字典,然后使用列表理解将其更改为
df.index=df.base\u column.map(字典)
表单,然后使用
df.index=df.base\u column.map(字典)

2) 如果新列位于同一df中,如何更改索引:

df.index=df[“您想要的列”]

3) 通过在旧列上映射创建新列:

df[“新列”]=df[“旧列”].map({“old1”:“new1”,…,“oldn”:“newn”})

1)当前索引的映射存在于单独的数据帧中,但数据帧中还没有映射列

这与问题2基本相同,只是需要为所需映射创建字典

#creating the mapping dictionary in the form of current index : future index

df2 = pd.DataFrame([["es"],["fr"]],index = ["spain","france"])
interm_dict = df2.to_dict("split") #Creates a dictionary split into column labels, data labels and data
mapping_dict = {country:data[0] for country,data in zip(interm_dict["index"],interm_dict['data'])}
#We only want the first column of the data and the index so we need to make a new dict with a list comprehension and zip

df["country"] = df.index #Create a new column if u want to save the index
df.index = pd.Series(df.index).map(mapping_dict) #change the index
df.index.name = "" #Blanks out index name
df = df.drop("county code",1) #Drops the county code column to avoid duplicate columns
之前:

       county code language
spain           es  spanish
france          fr   french
   county code language
spain           es  spanish
french          fr   french
       county code language
spain           es  spanish
france          fr   french
之后:

   language country

es  spanish   spain
fr   french  france
   language country

es  spanish   spain
fr   french  french
       county code language       city
spain           es  spanish  barcelona
france          fr   french      paris
2)将当前索引更改为数据帧中已有的列之一

df = pd.DataFrame([["es","spanish"],["fr","french"]], columns = ["county code","language"], index = ["spain", "french"])
df["country"] = df.index #if you want to save the original index
df.index = df["county code"]  #The only step you actually need
df.index.name = "" #if you want a blank index name
df = df.drop("county code",1) #if you dont want the duplicate column
之前:

       county code language
spain           es  spanish
france          fr   french
   county code language
spain           es  spanish
french          fr   french
       county code language
spain           es  spanish
france          fr   french
之后:

   language country

es  spanish   spain
fr   french  france
   language country

es  spanish   spain
fr   french  french
       county code language       city
spain           es  spanish  barcelona
france          fr   french      paris
3)基于另一列创建附加列 这与步骤2基本相同,只是我们创建了一个附加列,而不是将
.index
分配给创建的序列

df = pd.DataFrame([["es","spanish"],["fr","french"]], columns = ["county code","language"], index = ["spain", "france"])
df["city"] = df["county code"].map({"es":"barcelona","fr":"paris"})
之前:

       county code language
spain           es  spanish
france          fr   french
   county code language
spain           es  spanish
french          fr   french
       county code language
spain           es  spanish
france          fr   french
之后:

   language country

es  spanish   spain
fr   french  france
   language country

es  spanish   spain
fr   french  french
       county code language       city
spain           es  spanish  barcelona
france          fr   french      paris

是否需要使用映射变量来执行此操作?输入“county”是有意的。上面的第三个解决方案很好。是否可以从变量强制转换下面的
code
部分
d=df2.set_index('country').code.to_dict()
因此行可以是这样的
d=df2.set_index(from_format).to_format.to_dict()
其中
from_format
to_format
是变量?如果
from_format
to_format
字符串变量,然后您可以使用:
d=df2.set_索引(from_format)[to_format].to_dict()