[英]Is it possible to merge two pandas dataframes based on indices and column names?
我有兩個數據框:
left = pd.DataFrame(
{
"Col": ["D", "C", "B", "A"],
},
index=[0, 1, 2, 3],
)
right = pd.DataFrame(
{
"A": ["A0", "A1", "A2", "A3"],
"B": ["B0", "B1", "B2", "B3"],
"C": ["C0", "C1", "C2", "C3"],
"D": ["D0", "D1", "D2", "D3"],
},
index=[0, 1, 2, 3],
)
是否可以根據左側的索引和col
以及右側的列名合並它們?
我需要得到以下結果:
result = pd.DataFrame(
{
"Col": ["D", "C", "B", "A"],
"Val": ["D0", "C1", "B2", "A3"],
},
)
嘗試
left['new'] = right.values[np.arange(len(left)), right.columns.get_indexer(left.Col)]
left
Out[129]:
Col new
0 D D0
1 C C1
2 B B2
3 A A3
請注意,我們曾經進行過lookup
,但已棄用,以上是numpy
lookup
的替代方法之一
這里我沒有使用index
的原因: numpy
沒有索引,所以我們需要 position 傳遞正確的值,大部分時間索引與 position 相同,但可能會有所不同。
另一種解決方案:
left["new"] = right.apply(lambda x: x[left.loc[x.name, "Col"]], axis=1)
print(left)
印刷:
Col new
0 D D0
1 C C1
2 B B2
3 A A3
替代方法(使用melt
將列轉換為索引,然后merge
):
left['id'] = left.index
m = right.melt(ignore_index=False, var_name="Col", value_name="Val")
m['id'] = m.index
result = pd.merge(left, m, on=["id", "Col"])[["Col", "Val"]]
它比使用apply
快,但比接受的答案慢。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.