2017-07-25 190 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谢谢你的评论,我在我的答案中添加了你的例子。如果可能的话,使用不同的索引很好。 –

相关问题