合并基于类似组/索引的多索引数据帧

问题描述 投票:1回答:1

我有一个多索引数据框,其中包含一些经济和社会指标。此代码可以生成示例数据框

import pandas as pd
import numpy as np
arrays = [['USA', 'USA', 'Egypt', 'Egypt', 'U.S.A.', 'U.S.A.', 'ARE, eg', 'ARE, eg', 'United States', 'France', 'France', 'France'],
[1950, 1980,1980, 2010, 2010, 1990, 1960, 1990, 2015, 1980, 1995, 2010]]
tuples = list(zip(*arrays))
index2 = pd.MultiIndex.from_tuples(list(zip(*arrays)), names=['Country', 'Year'])
cols= ['ind1', 'ind2', 'ind3', 'ind4']
df = pd.DataFrame(np.random.randn(12, 4), index=index2, columns=cols)
df.iloc[1::4,0] = np.nan; df.iloc[2::4,1] = np.nan; df.iloc[::3,2] = np.nan; df.iloc[1::3,3] = np.nan

df

这是一个示例输出:

enter image description here

问题是数据框在数据框索引中包含许多类似拼写错误的密钥。例如,美国输入一次为美国,美国,美国或美国等。我想根据包含可能名称的列表合并这些组,其中列的值合并(如果重复,则为平均值) )并排序。

new_names={'USA':['USA', 'U.S.A.', 'US', 'United States'],
'Egypt': ['Egypt', 'ARE', 'Egypt, the Arab Republic of',  'ARE, eg']}

如何在这个多索引pandas数据帧中有效地执行此合并?

python pandas sorting merge
1个回答
1
投票

IIUC,你可以这样做:

首先,让我们“反转”该字典,使其达到pd.dataframes中rename方法的适当格式。

rename_dict = {}
for k,v in dfnew_names.items():
    for item in v:
        rename_dict[item]=k

其次,让我们使用重新格式化的字典和排序重命名数据框中的索引。

df.rename(index=rename_dict).sort_index()

输出:

                  ind1      ind2      ind3      ind4
Country Year                                        
Egypt   1960  0.964161       NaN       NaN -0.909796
        1980 -0.568132       NaN -1.018460  2.295120
        1990  0.185795 -0.517331  1.276134       NaN
        2010  0.067946  0.895027       NaN  2.141615
France  1980       NaN  0.124058       NaN  1.377971
        1995 -2.153890       NaN  1.334341       NaN
        2010  0.019129  0.807188  0.804133 -0.698463
USA     1950 -0.023521  0.432706       NaN -0.701396
        1980       NaN  0.824445  1.027330       NaN
        1990       NaN  0.848902 -1.537311 -0.624271
        2010  0.641681 -0.504838 -1.383700       NaN
        2015  0.688233 -0.277385  2.036573 -0.821976

如果你有多年使用groupby更新

df.rename(index=rename_dict).groupby(level=[0,1]).mean()

或者,你可以使用meanlevel参数(这是更好的方法):

df.rename(index=rename_dict).mean(level=[0,1]).sort_index()
© www.soinside.com 2019 - 2024. All rights reserved.