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()