2013-09-26 92 views
8

Tôi có một DataFrame panda với dữ liệu DATE_TIME/điện áp như thế này (df1):Hãy so sánh 2 cột 2 dataframes gấu trúc khác nhau, nếu cùng chèn 1 vào khác bằng Python

 Date_Time Chan 
0 20130401 9:00 AAT 
1 20130401 10:00 AAT 
2 20130401 11:00 AAT 
3 20130401 12:00 AAT 
4 20130401 13:00 AAT 
5 20130401 14:00 AAT 
6 20130401 15:00 AAT 

Tôi đang sử dụng này như một nguyên mẫu để tải dữ liệu từ một tệp dữ liệu lớn hơn nhiều và tạo một DataFrame. Các DataFrame khác trông như thế này (df2):

Chan   date_time Sens1 Sens2 
AAC 01-Apr-2013 09:00 5.17 1281 
AAC 01-Apr-2013 10:00 5.01 500 
AAC 01-Apr-2013 12:00 5.17 100 
AAC 01-Apr-2013 13:00 5.19 41997 
AAC 01-Apr-2013 16:00 5.21 2123 
AAT 01-Apr-2013 09:00 28.82 300 
AAT 01-Apr-2013 10:00 28.35 4900 
AAT 01-Apr-2013 12:00 28.04 250 
AAE 01-Apr-2013 11:00 3.36 400 
AAE 01-Apr-2013 12:00 3.41 200 
AAE 01-Apr-2013 13:00 3.40 2388 
AAE 01-Apr-2013 14:00 3.37 300 
AAE 01-Apr-2013 15:00 3.35 500 
AXN 01-Apr-2013 09:00 23.96 6643 
AXN 01-Apr-2013 10:00 24.03 1000 
AXW 01-Apr-2013 11:00 46.44 2343 

Vì vậy, những gì tôi muốn làm là tìm kiếm df2 cho tất cả các trường hợp của một trận đấu từ cả hai cột của df1 (lưu ý các định dạng dữ liệu khác nhau) và chèn dữ liệu từ df2 vào df1. Như thế này (df1)

  Date_Time Chan Sens1 Sens2 
0 20130401 9:00 AAT 28.82 300 
1 20130401 10:00 AAT 28.35 4900 
2 20130401 11:00 AAT NaN NaN 
3 20130401 12:00 AAT 28.04 250 
4 20130401 13:00 AAT NaN NaN 
5 20130401 14:00 AAT NaN NaN 
6 20130401 15:00 AAT NaN NaN 

Ông có thể cho tôi một số gợi ý cho mã python/gấu trúc để phù hợp với psuedocode này:

if (df1['date_time'] = df2['date_time']) & (df1['Chan'] = df2['Chan'])): 
    df1['Sens1'] = df2['Sens1'] 
    df1['Sens2'] = df2['Sens2'] 

Nếu nó ảnh hưởng câu trả lời, đó là ý định của tôi để bfill và ffill các NaN và sau đó thêm DataFrame này vào một Panel và sau đó lặp lại với tên kênh khác thay cho AAT.

Trả lời

9

Bạn có thể sử dụng đồng bằng ol 'hợp nhất để thực hiện việc này. Nhưng trước tiên, bạn nên làm một chút dọn dẹp của bạn DataFrames, để đảm bảo cột datetime của bạn đang thực sự datetimes chứ không phải là chuỗi (Lưu ý: nó có thể tốt hơn để làm điều này khi đọc dưới dạng csv hoặc bất kỳ):

df1['Date_Time'] = pd.to_datetime(df1['Date_Time'], format='%Y%m%d %H:%M') 
df2['date_time'] = pd.to_datetime(df2['date_time']) 

Chúng ta hãy cũng đổi tên các cột Datetime có cùng tên:

df1.rename(columns={'Date_Time': 'Datetime'}, inplace=True) 
df2.rename(columns={'date_time': 'Datetime'}, inplace=True) 

Bây giờ một hợp nhất đơn giản sẽ cung cấp cho bạn những gì bạn đang sau:

In [11]: df1.merge(df2) 
Out[11]: 
      Datetime Chan Sens1 Sens2 
0 2013-04-01 09:00:00 AAT 28.82 300 
1 2013-04-01 10:00:00 AAT 28.35 4900 
2 2013-04-01 12:00:00 AAT 28.04 250 

In [12]: df1.merge(df2, how='left') 
Out[12]: 
      Datetime Chan Sens1 Sens2 
0 2013-04-01 09:00:00 AAT 28.82 300 
1 2013-04-01 10:00:00 AAT 28.35 4900 
2 2013-04-01 11:00:00 AAT NaN NaN 
3 2013-04-01 12:00:00 AAT 28.04 250 
4 2013-04-01 13:00:00 AAT NaN NaN 
5 2013-04-01 14:00:00 AAT NaN NaN 
6 2013-04-01 15:00:00 AAT NaN NaN 
+0

tôi có thể thấy làm thế nào mà có thể làm việc, nhưng tôi nhận được một lỗi: "TypeError: to _datetime() nhận được đối số từ khóa không mong muốn 'định dạng' "trong dòng pd.to_datetime. Đây có phải là một hàm được thêm định dạng trong phiên bản sau của gấu trúc hay không. Tôi có phiên bản gấu trúc đã được đóng gói với Pyzo (mà tôi nghĩ là 0,12). – knight2270

+0

Theo "pd .__ version__" này, tôi có phiên bản 0.10.1. Hãy để tôi khắc phục điều đó và quay trở lại vấn đề này, vì tôi đã đọc một số điều về thay đổi định dạng từ 10 đến 12. – knight2270

+0

OK Vì vậy, tôi có serached cao và thấp. Tôi tin rằng gói Pyzo 2013b bó gấu trúc 0.10.0. Mới nhất là 0.12.0 Tôi không thể có được phương pháp định dạng ', định dạng ='% Y% m% d% H:% M '' – knight2270