2012-03-20 25 views
20

Tôi muốn thực hiện thao tác nối/hợp nhất/nối thêm trên một khung dữ liệu với chỉ mục datetime.tham gia hoặc hợp nhất với ghi đè trong gấu trúc

Giả sử tôi có df1 và tôi muốn thêm df2 vào đó. df2 có thể có ít hoặc nhiều cột và chỉ mục trùng lặp. Đối với tất cả các hàng trong đó các chỉ mục khớp nhau, nếu df2 có cùng một cột là df1, tôi muốn các giá trị của df1 được ghi đè với các giá trị từ df2.

Làm cách nào để có được kết quả mong muốn?

Trả lời

22

Làm thế nào về: df2.combine_first(df1)?

In [33]: df2 
Out[33]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 

In [34]: df1 
Out[34]: 
        A   B   C 
2000-01-03 2.288863 0.188175 -0.040928 
2000-01-04 0.159107 -0.666861 -0.551628 
2000-01-05 -0.356838 -0.231036 -1.211446 
2000-01-06 -0.866475 1.113018 -0.001483 
2000-01-07 0.303269 0.021034 0.471715 
2000-01-10 1.149815 0.686696 -1.230991 
2000-01-11 -1.296118 -0.172950 -0.603887 
2000-01-12 -1.034574 -0.523238 0.626968 
2000-01-13 -0.193280 1.857499 -0.046383 
2000-01-14 -1.043492 -0.820525 0.868685 

In [35]: df2.comb 
df2.combine  df2.combineAdd  df2.combine_first df2.combineMult  

In [35]: df2.combine_first(df1) 
Out[35]: 
        A   B   C   D 
2000-01-03 0.638998 1.277361 0.193649 0.345063 
2000-01-04 -0.816756 -1.711666 -1.155077 -0.678726 
2000-01-05 0.435507 -0.025162 -1.112890 0.324111 
2000-01-06 -0.210756 -1.027164 0.036664 0.884715 
2000-01-07 -0.821631 -0.700394 -0.706505 1.193341 
2000-01-10 1.015447 -0.909930 0.027548 0.258471 
2000-01-11 -0.497239 -0.979071 -0.461560 0.447598 
2000-01-12 -1.034574 -0.523238 0.626968  NaN 
2000-01-13 -0.193280 1.857499 -0.046383  NaN 
2000-01-14 -1.043492 -0.820525 0.868685  NaN 

Lưu ý rằng phải mất các giá trị từ df1 cho chỉ số không trùng lặp với các df2. Nếu điều này không làm chính xác những gì bạn muốn tôi sẽ sẵn sàng để cải thiện chức năng này/thêm tùy chọn cho nó.

+0

Tôi nghĩ điều này thực sự là điều tôi muốn, cảm ơn rất nhiều. – saroele

+0

Có một vấn đề với 'combined_first' - sử dụng nó để kết hợp ba dataframes của một số hàng 30k mỗi bộ vượt qua tất cả bộ nhớ của tôi. Bất kỳ cách nào xung quanh điều này? – scry

+0

Tôi nghĩ nó sẽ trực quan hơn nhiều nếu chức năng này là một phần của hàm 'df.update' với tham số tùy chọn' join = 'outer'' (hiện tại chỉ 'left' được thực hiện). Trong trường hợp của tôi, 'df2' (tính từ' df1') có ít cột hơn 'df1' (nhưng một số không nằm trong' df1') và tôi muốn cập nhật 'df1' với các giá trị được tính nếu có thể cộng với các cột bổ sung. Đối với điều này, tôi nghĩ rằng 'df1.update (df2, join = 'outer')' sẽ dễ hiểu hơn nhiều so với 'df1 = df2.combine_first (df1)'. PS. Đây là một câu hỏi nhỏ, nhưng nếu không thì 'pandas' gần như là tuyệt vời! =) – Axel

6

Để hợp nhất như thế này, phương pháp update của DataFrame hữu ích.

Lấy ví dụ từ documentation:

import pandas as pd 
import numpy as np 

df1 = pd.DataFrame([[np.nan, 3., 5.], [-4.6, np.nan, np.nan], 
        [np.nan, 7., np.nan]]) 
df2 = pd.DataFrame([[-42.6, np.nan, -8.2], [-5., 1.6, 4]], 
        index=[1, 2]) 

dữ liệu trước khi update:

>>> df1 
    0 1 2 
0 NaN 3.0 5.0 
1 -4.6 NaN NaN 
2 NaN 7.0 NaN 
>>> 
>>> df2 
     0 1 2 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

Hãy cập nhật df1 với dữ liệu từ df2:

df1.update(df2) 

dữ liệu sau khi cập nhật:

>>> df1 
     0 1 2 
0 NaN 3.0 5.0 
1 -42.6 NaN -8.2 
2 -5.0 1.6 4.0 

Ghi chú:

  • Điều quan trọng là bạn phải nhận thấy rằng đây là một hoạt động "tại chỗ", sửa đổi DataFrame mà các cuộc gọi update.
+3

Điều này trực quan hơn 'combined_first' bởi vì nó hoạt động chính xác như phương thức' update' mà chúng ta biết từ dicts. – saroele

Các vấn đề liên quan