【问题标题】:Merging multi-index dataframes based on similar groups/indexes基于相似组/索引合并多索引数据框
【发布时间】:2018-06-12 08:46:35
【问题描述】:

我有一个包含一些经济和社会指标的多索引数据框 这段代码可以生成一个示例数据框

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

这是一个示例输出:

问题在于数据帧索引中包含许多类似拼写错误的键。例如,美国输入一次为 USA、U.S.A.、US 或 United States 等。 我想根据包含可能名称的列表合并这些组,其中列的值被合并(如果重复则作为平均值)并排序。

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】:

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

    【讨论】:

    • 非常感谢,但是,如果年复一年,如何添加“平均”聚合函数?
    • @MohammadElNesr 查看更新。您需要使用 groubpy。
    • 再次感谢,但最后一行(使用均值和级别)导致未排序的数据帧。我们可以添加 groupby 或使用它进行排序吗?
    • 您可以在平均水平之后添加 sort_index()。 df.rename(index=rename_dict).mean(level=[0,1]).sort_index() 更新的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 2019-03-18
    • 1970-01-01
    相关资源
    最近更新 更多