2015-04-16 60 views
2

我想使用第二個數據框添加和更新熊貓數據框中的多個列。我得到的問題是當我想要添加的列數與基數據框中的列數不匹配時,我得到以下錯誤:「傳遞值的形狀是(2,3),索引意味着(2,2 )」熊貓更新多個字段

問題的簡化版本低於

tst = DataFrame({"One":[1,2],"Two":[2,4]}) 

def square(row): 
    """ 
    for each row in the table return multiple calculated values 
    """ 
    a = row["One"] 
    b = row["Two"] 
    return a ** 2, b ** 2, b ** 3 

#create three new fields from the data 
tst[["One^2", "Two^2", "Two^3"]] = tst.apply(square, axis=1) 

如果要添加字段的數量相匹配的數量已經在opertaion按預期工作表。

tst = DataFrame({"One":[1,2],"Two":[2,4]}) 

def square(row): 
    """ 
    for each row in the table return multiple calculated values 
    """ 
    a = row["One"] 
    b = row["Two"] 
    return a ** 2, b ** 2 

#create three new fields from the data 
tst[["One^2", "Two^2"]] = tst.apply(square, axis=1) 

我知道我可以做到每場seperately但在實際的問題,我試圖解決我進行「更新」(即平方)內被更新的表和外部表之間的連接,並希望能夠一次獲取所有必需的信息。

以下是我將如何在SQL中完成它。不幸的是,這兩個數據幀包含來自不同數據庫技術的數據,因此我必須在熊貓中執行操作。

update tu 
set  tu.a_field = upd.the_field_i_want 
     tu.another_field = upd.the_second_required_field 
from to_update tu 
     inner join the_updater upd 
      on tu.item_id = upd.item_id 
      and tu.date between upd.date_from and upd.date_to 

在這裏,你可以看到我想要做的事情的確切細節。我有一個表「to_update」,其中包含針對item_id的時間點信息。另一個表「the_updater」包含對item_id的日期範圍信息。例如,一個特定的item_id可能與customer_1一起從DateA到DateB,而customer_2在DateB和DateC等之間。我希望能夠將包含日期範圍的表中的信息與時間點表對齊。

請注意,由於數據問題(這實際上是作爲數據質量測試的一部分編寫的)合併將不起作用。我真的需要能夠複製上述更新語句的功能。

我明顯可以做它作爲一個循環,但我希望在可能的情況下使用熊貓框架。

+0

那麼你想在這裏做什麼?爲平方值這是微不足道的執行,並不需要在這種情況下使用'應用' – EdChum

+0

我想創建任意多個字段並使用apply方法同時分配它們的值。示例中的簡單函數只是表示我可能想要用於生成新字段的任意函數。問題是當試圖在上面的例子中創建多於1個字段的錯誤。一旦我可以做到這一點,我可以用任何值代替平凡的功能。 –

回答

0

在數據幀聲明一個空列,並將其分配給零

 tst["Two^3"] = 0

然後該列做相應的操作,與其他列一起

 tst[["One^2", "Two^2", "Two^3"]] = tst.apply(square, axis=1)

嘗試打印

 print tst.head(5)
+0

非常感謝,解決了這個問題。但是,如果我然後設置我的平方函數回覆第三個值我得到一個類似的錯誤,但維度值遞增。'tst = DataFrame({「One」:[1,2],「Two」:[2,4]}) def square(row): 「」「 表中的每一行返回多個計算值 「」「 a = row [」One「] b = row [」Two「] return a ** 2,b ** 2,b ** 3,b ** 4 tst [」Two^3「] = 0 tst [[」One^2「,」Two^2「,」Two^3「,」Two^4「]] = tst.apply(square,axis = 1) tst'Do you知道底下發生了什麼? –

+0

嘗試在for循環中編寫此tst [「Two^3」] = 0,以便在循環中動態創建列,如[「Two^3」],[「Two^4」],並將其指定爲零。 –

+0

這肯定會解決這個問題。但是它會涉及一次只返回一個字段。我很好奇的是能夠使用apply來返回arbritrarily很多領域。通過能夠做到這一點,它應該允許更乾淨的代碼。 –