簡體   English   中英

是否可以根據索引和列名合並兩個 pandas 數據幀?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM