2017-07-25 71 views
1

我想從數據幀從Y.從另一個數據幀

X = pd.DataFrame({'A': ['A0', 'A1', 'A2'], 
        'B': ['B0', 'B1', 'B2'], 
        'C': ['C0', 'C1', 'C2'], 
        'D': ['D0', 'D1', 'D2']}) 

    A B C D 
0 A0 B0 C0 D0 
1 A1 B1 C1 D1 
2 A2 B2 C2 D2 

Y = pd.DataFrame({'A': ['A0', 'A1'], 
        'B': ['B0', 'B1'], 
        'C': ['C0xx', 'C1xx'], 
        'D': ['D0xx', 'D1xx']}) 

    A B  C  D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 

更新值的數據幀x和結果的值更新數據幀是:

A B C D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 
2 A2 B2 C2 D2 

當然我的數據幀是匹配大。

+0

什麼是輸出如果'Y = pd.DataFrame({ 'A':[ 'A0', 'A1'], 'B':[ 'B0', 'B1'], 「C ':['C0xx','C1xx'], 'D':['D0xx','D1xx']},index = [2,1])'? – jezrael

回答

1

我認爲你需要combine_firstset_index如果需要通過A, B列在這兩個df添加缺少的值:

print (Y.set_index(['A','B']).combine_first(X.set_index(['A','B'])).reset_index()) 

    A B  C  D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 
2 A2 B2 C2 D2 

不幸的是update工作不好:

Y = pd.DataFrame({'A': ['A0', 'A1'], 
        'B': ['B0', 'B1'], 
        'C': ['C0xx', 'C1xx'], 
        'D': ['D0xx', 'D1xx']}, index=[2,1]) 
print (X) 
    A B C D 
0 A0 B0 C0 D0 
1 A1 B1 C1 D1 
2 A2 B2 C2 D2 

print (Y) 
    A B  C  D 
2 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 

X.update(Y) 
print (X) 
    A B  C  D 
0 A0 B0 C0 D0 
1 A1 B1 C1xx D1xx 
2 A0 B0 C0xx D0xx 

X.set_index(['A','B']).update(Y.set_index(['A','B'])) 
print (X) 
    A B C D 
0 A0 B0 C0 D0 
1 A1 B1 C1 D1 
2 A2 B2 C2 D2 

print (Y.set_index(['A','B']).combine_first(X.set_index(['A','B'])).reset_index()) 
    A B  C  D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 
2 A2 B2 C2 D2 
+0

謝謝你真的有幫助。 –

+0

很高興能幫到你!祝你好運,美好的一天! – jezrael

3

1.兩個DataFrames具有相同的索引

這是你在你的問題中給出的示例介紹了情況。 您可能需要使用update方法:

>>> X.update(Y) 
>>> X 

    A B  C  D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 
2 A2 B2 C2 D2 

它也可以,如果線在X和Y不同的順序:

>>> Y = pd.DataFrame({'A': ['A1', 'A0'], 
         'B': ['B1', 'B0'], 
         'C': ['C1xx', 'C0xx'], 
         'D': ['D1xx', 'D0xx']}, 
        index=[1,0]) 
>>> Y 
    A B  C  D 
1 A1 B1 C1xx D1xx 
0 A0 B0 C0xx D0xx 

>>> X.update(Y) 
>>> X 
    A B  C  D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 
2 A2 B2 C2 D2 

2.不同的指標

如果Y具有不同的指標:

>>> Y = pd.DataFrame({'A': ['A0', 'A1'], 
         'B': ['B0', 'B1'], 
         'C': ['C0xx', 'C1xx'], 
         'D': ['D0xx', 'D1xx']}, 
        index=[2,1]) 
>>> Y 

    A B  C  D 
2 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 

你仍然可以使用update如果您可以找到可用作索引的另一列(標識行以使它們與要替換的行匹配)。我以「A」列爲例,但多重索引也會起作用。

>>> X2, Y2 = X.set_index("A"), Y.set_index("A") 
>>> X2.update(Y2) 
>>> X2.reset_index(inplace=True) 
>>> X2 
    A B  C  D 
0 A0 B0 C0xx D0xx 
1 A1 B1 C1xx D1xx 
2 A2 B2 C2 D2 
+0

非常整潔的答案! –

+0

它的作用僅僅是因爲兩個數據框中的第一行具有相同的索引,實際數據中的內容是不可能的。檢查我的編輯。 – jezrael

+1

@jezrael謝謝你的評論,我在我的答案中添加了你的例子。如果可能的話,使用不同的索引很好。 –

相關問題