我有三個要比較的資料框,其中存盤了多個資料,其中一個是我感興趣的資訊,這是我想要完成的。第二個是我想添加到我的通用資料幀的坐標列,第三個是存盤值對應的前兩個資料幀的索引。
這有點令人困惑,但我舉了一個例子,你可以更好地看到它:
資料框 1:
| 指數 | n_tree |
|---|---|
| 247 | 1 |
| 248 | 2 |
資料框 2:
| 指數 | 坐標 |
|---|---|
| 1400 | (20,47) |
| 1401 | (30,85) |
資料框 3:
| 指數 | index_dataframe_1 | index_dataframe_2 |
|---|---|---|
| 0 | 247 | 1401 |
我的意圖是我的通用資料框包含正確的坐標列。如下:
| 指數 | n_tree | 坐標 |
|---|---|---|
| 247 | 1 | (30,85) |
我試圖用 .iloc、.loc、.at 分配它,但出現以下錯誤:
for idx, rw in dataframe_3.iterrows():
coords = dataframe_1.loc[rw.index_dataframe_2, "coords"]
dataframe_2.loc[int(rw.index_dataframe_1), "coords"] = coords
ValueError:使用可迭代物件設定時必須具有相等的 len 鍵和值。
uj5u.com熱心網友回復:
您可以執行兩個合并:
(df3.merge(df1, left_on='index_dataframe_1', right_index=True)
.merge(df2, left_on='index_dataframe_2', right_index=True)
[['n_tree', 'coords']]
)
輸出:
n_tree coords
index
0 1 (30,85)
輸入:
>>> df1
n_tree
index
247 1
248 2
>>> df2
coords
index
1400 (20,47)
1401 (30,85)
>>> df3
index_dataframe_1 index_dataframe_2
index
0 247 1401
uj5u.com熱心網友回復:
通過以下方式使用 2 個內部聯接.merge():
(假設index您的資料框中是資料列而不是行索引):
df_out = (df1.merge(df3, left_on='index', right_on='index_dataframe_1', suffixes=('', '_y'))
.merge(df2, left_on='index_dataframe_2', right_on='index', suffixes=('', '_z'))
)
df_out = df_out[['index', 'n_tree', 'coords']]
結果:
print(df_out)
index n_tree coords
0 247 1 (30,85)
uj5u.com熱心網友回復:
我認為這對你有用:
import pandas as pd
import numpy as np
df1 = pd.DataFrame({'index': [247, 248], 'n_tree': [1, 2]}).set_index('index')
df2 = pd.DataFrame({'index': [1400, 1401], 'coords': [(20,47), (30,85)]}).set_index('index')
df3 = pd.DataFrame({'index': [0], 'index_dataframe_1': [247], 'index_dataframe_2': [1401]}).set_index('index')
mapping = dict(zip(df3.index_dataframe_1, df3.index_dataframe_2))
l = list()
for i in df1.index:
m = mapping.get(i, np.nan)
if m is not np.nan:
l.append(df2.at[m, 'coords'])
else:
l.append(np.nan)
df1['coords'] = l
print(df1)
結果:
n_tree coords
index
247 1 (30, 85)
248 2 NaN
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/313004.html
