【问题标题】:How to create new rows in multiindex DataFrames using existing data?如何使用现有数据在多索引 DataFrames 中创建新行?
【发布时间】:2022-07-05 18:07:50
【问题描述】:

我有一个像这样的多索引数据框

                          Value
Source       Partner              
USA          DEU          20
             CHN          10
             MEX          5
DEU          USA          12
             CHN          6
             MEX          2
CHN          USA          1
             DEU          2
             MEX          3

我想添加行以按“来源”和“合作伙伴”表示一些核心国家/地区的汇总,例如美国、德国和中国。新行的预期输出如下:

                          Value
Source       Partner              
CORE         USA          13
             DEU          22
             CHN          16
USA          CORE         30
CHN          CORE         3
DEU          CORE         18

Source 和 Partner 是两个多元指数。

有什么简洁快速的方法来生成第二个输出数据帧?在实际应用中我当然还有更多的国家。

【问题讨论】:

  • 您好,您从什么来源添加新行?另一个多索引数据框?如果没有,你如何“生成”它们?
  • @Laurent 我手动创建了一个我称之为“CORE”的国家/地区列表,即我可以输入一个列表 ['USA','DEU','CHN']。然后我使用原始 df 创建新行,例如对于源“CORE”和合作伙伴“USA”,我总结了 CORE 组中具有合作伙伴“USA”的所有源。从上面看,例子是 12+1 = 13。

标签: python pandas


【解决方案1】:

使用您的初始数据框:

import pandas as pd

data = {
    ("USA", "DEU"): 20,
    ("USA", "CHN"): 10,
    ("USA", "MEX"): 5,
    ("DEU", "USA"): 12,
    ("DEU", "CHN"): 6,
    ("DEU", "MEX"): 2,
    ("CHN", "USA"): 1,
    ("CHN", "DEU"): 2,
    ("CHN", "MEX"): 3,
}

df = pd.DataFrame(list(data.values()), index=data.keys(), columns=["Value"])
df.index.names = ["Source", "Partner"]

这是一种方法:

CORE = ["USA", "DEU", "CHN"]

# Build first part of the expected dataframe
df1 = df.reset_index()
df1["Source"] = "CORE"
df1 = (
    df1.loc[df1["Partner"].isin(CORE), :]
    .groupby(["Source", "Partner"])
    .agg(sum)
    .sort_values("Partner", ascending=False)
)

print(df1)
# Output

# Build second part
df2 = df.reset_index()
df2 = (
    df2.loc[df2["Partner"].isin(CORE), :]
    .assign(Partner="CORE")
    .groupby(["Source", "Partner"])
    .agg(sum)
    .reindex(
        index=pd.MultiIndex.from_tuples(
            [("USA", "CORE"), ("CHN", "CORE"), ("DEU", "CORE")],
            names=["Source", "Partner"],
        )
    )
)

print(df2)
# Output

然后:

# Build final dataframe
new_df = pd.concat([df1, df2])
print(new_df)
# Output

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-11-10
    • 2014-02-10
    • 2019-08-11
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 2012-09-17
    相关资源
    最近更新 更多