假設我有一個df帶有多索引 ['siec', 'geo'] 的 DataFrame(以斜體顯示):
| 賽克 | 地理 | 價值 |
|---|---|---|
| 一個 | 德 | 1 |
| 一個 | FR | 2 |
和一個映射DataFrame mapping_dffrom geotoid_region一個索引['geo']:
| 地理 | id_region |
|---|---|
| 德 | 10 |
| FR | 20 |
=>我如何加入/合并/替換索引列'geo'df與列'id_region'的值mapping_df?
新的多索引 ['siec', 'id_region'] 的預期結果:
| 賽克 | id_region | 價值 |
|---|---|---|
| 一個 | 10 | 1 |
| 一個 | 20 | 2 |
我嘗試了以下代碼:
import pandas as pd
df = pd.DataFrame([{'siec': 'a', 'geo': 'DE', 'value': 1}, {'siec': 'a', 'geo': 'FR', 'value': 1}])
df.set_index(['siec', 'geo'], inplace=True)
mapping_df = pd.DataFrame([{'geo': 'DE', 'id_region': 10}, {'geo': 'FR', 'id_region': 20}])
mapping_df.set_index(['geo'], inplace=True)
joined_data = df.join(mapping_df)
merged_data = df.merge(mapping_df, left_index=True, right_index=True)
但它不符合我的要求。它添加了一個附加列并保留舊索引。
| 賽克 | 地理 | 價值 | id_region |
|---|---|---|---|
| 一個 | 德 | 1 | 10 |
| 一個 | FR | 2 | 20 |
=> 是否有適合我的用例的便捷方法,或者我需要在加入步驟后手動更正索引?
作為一種解決方法,我可以reindex()使用 DataFrame,進行一些連接操作,然后重新引入一些多索引。
但是,如果可能的話,我想避免在索引和非索引版本的 DataFrames 之間來回切換(?)。
uj5u.com熱心網友回復:
嘗試如下。
- 用于
MultiIndex.get_level_values僅選擇級別1(或geo:)Index.map并mapping_df['id_region']作為映射器應用。 - 將結果包裝在里面
MultiIndex.set_levels覆寫 level1。 - 最后,鏈
Index.set_names重命名關卡(或使用MultiIndex.rename)。
df.index = df.index.set_levels(
df.index.get_level_values(1).map(mapping_df['id_region']), level=1)\
.set_names('id_region', level=1)
print(df)
value
siec id_region
a 10 1
20 2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/510812.html
標籤:Python熊猫加入映射
