2012-06-19 19 views
29

Her ikisi de timeseries tarafından dizinlenmiş iki dataframes var. Yeni bir dataframe oluşturmak için öğeleri eklemem gerekir, ancak yalnızca dizin ve sütun aynıysa. Öğe, dataframe s'den birinde mevcut değilse, o zaman sıfır olarak ele alınmalıdır.İki pandalık veri karesi ekleme

.add kullanmayı denedim, ancak bu, dizin ve sütuna bakılmaksızın toplamları tutar. Ayrıca, basit bir combined_data = dataframe1 + dataframe2 çalıştı, ancak bu, her iki veri çerçeve öğesi yoksa, bir NaN verin.

Herhangi bir öneriniz var mı? İki dataframes toplamını verecektir

(x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 

Bu: Ben doğru anlamak

+0

kullanmak

? Öğenin * bir * veri çerçevesinde yoksa, sıfıra göre işleme tabi tutulduğunu söylüyorsunuz --- bu veri çerçevesindeki değerin sıfır olarak ele alınması gerektiğini ve diğer veri çerçevesindeki değere eklendiğini mi kastediyorsunuz, yoksa siz mi demek istiyorsunuz? Sonuç veri çerçevesindeki değer sıfır olmalıdır? Ayrıca, "df1 + df2" nin her ikisi de öğeye sahip değilse NaN verdiğinden çalışmaz diyorsunuz. Bu durumda ne olmak istiyorsun? Sonuçta sıfır mı istiyorsun? – BrenBarn

cevap

48

x.add(y, fill_value=0) nasıl?

ilk benim desen hem dataframes, sonra bunların her katılacak senkronize etmek için ( tarihleri ​​) ortak endeksi alacak ve ben sütunlarını özetleyecek ... daha genel bir cevap verme için
import pandas as pd 

df1 = pd.DataFrame([(1,2),(3,4),(5,6)], columns=['a','b']) 
Out: 
    a b 
0 1 2 
1 3 4 
2 5 6 

df2 = pd.DataFrame([(100,200),(300,400),(500,600)], columns=['a','b']) 
Out: 
    a b 
0 100 200 
1 300 400 
2 500 600 

df_add = df1.add(df2, fill_value=0) 
Out: 
    a b 
0 101 202 
1 303 404 
2 505 606 
+0

Mükemmel, tam da neyin peşindeydim. Teşekkürler – cs0679

7

, gibi bir şey istiyorum. Bir değer bir veri çerçevesinde, diğeri değilse, o pozisyondaki sonuç o mevcut değer olacaktır. Her iki veri çerçevesinde bir değer eksikse, o konumda sonuç sıfır olacaktır.

>>> x 
    A B C 
0 1 2 NaN 
1 3 NaN 4 
>>> y 
    A B C 
0 8 NaN 88 
1 2 NaN 5 
2 10 11 12 
>>> (x.reindex_like(y).fillna(0) + y.fillna(0)).fillna(0) 
    A B C 
0 9 2 88 
1 5 0 9 
2 10 11 12 
+1

Teşekkürler, ancak her iki DataFrames'de farklı sütunlara sahip olduğum için verileri açıklamamıştım. Dataframe1'de A, B, C ve dataframe 2'de A, B, A, B, C, D – cs0679

+0

ile bir dataframe olmalıdır. Bu cevap benim kullanım-case için çalışır. Teşekkürler! – ivrin

0

aynı isim ve nihayet (google'ın hisse senedi fiyatları google alınan birlikte) burada bir örnek görebilirsiniz

, (bunlardan biri eklenen sütunlar silme) her iki dataframes katılmak:

import numpy as np 
import pandas as pd 
import datetime as dt 

prices = pd.DataFrame([[553.0, 555.5, 549.3, 554.11, 0], 
         [556.8, 556.8, 544.05, 545.92, 545.92], 
         [545.5, 546.89, 540.97, 542.04, 542.04]], 
         index=[dt.datetime(2014,11,04), dt.datetime(2014,11,05), dt.datetime(2014,11,06)], 
         columns=['Open', 'High', 'Low', 'Close', 'Adj Close']) 

corrections = pd.DataFrame([[0, 555.22], [1238900, 0]], 
        index=[dt.datetime(2014,11,3), dt.datetime(2014,11,4)], 
        columns=['Volume', 'Adj Close']) 

dates = pd.DataFrame(prices.index, columns = ['Dates']).append(pd.DataFrame(corrections.index, columns = ['Dates'])).drop_duplicates('Dates').set_index('Dates').sort(axis=0) 
df_corrections = dates.join(corrections).fillna(0) 
df_prices = dates.join(prices).fillna(0) 

for col in prices.columns: 
    if col in corrections.columns: 
     df_prices[col]+=df_corrections[col] 
     del df_corrections[col] 

df_prices = df_prices.join(df_corrections) 
1

hem yukarıdaki cevapları - fillna(0) ve doğrudan bir ekleme, her ikisi de farklı yapıları varsa Nan değerleri verecektir. Onun iyi sen bir öğe birinin veya her ikisinin dataframes de yoksa ne olmasını istediğinizi açıklamak Can fill_value

df.add(other_df, fill_value=0)