2017-04-18 66 views
2

我有熊貓dataframes爲:大熊貓從列表中的每一行減去相同數量的

df1['A'].ix[1:3] 
2017-01-01 02:00:00 [33, 34, 39] 
2017-01-01 03:00:00 [3, 43, 9] 

df2['B'].ix[1:3] 
2017-01-01 02:00:00 2 
2017-01-01 03:00:00 3 

我想執行以下操作:

difference = df1 - df2 

預期的結果是:

(df1 - df2).ix[1:3] 
2017-01-01 02:00:00 [31, 32, 37] 
2017-01-01 03:00:00 [0, 40, 6] 

df2從相應的列表中df1

01即數。減去

df1每個列表具有相同的大小。

我想不出更好的辦法比list comprehension

回答

3

你可以從列表轉換的列值的numpy的數組,然後做df1.A - df2.B

df1.A = df1.A.map(np.array) 
difference = df1.A - df2.B 
+1

簡單,但很優雅的解決方案! – MaxU

5

我不能告訴什麼對象在df1。可能是list也許np.array? IDK?

更好的創建我自己的例子

A = pd.Series([[33, 34, 39], [3, 43, 9]]) 
B = pd.Series([2, 3]) 

選項1
apply(np.asarray)

A.apply(np.asarray) - B 

0 [31, 32, 37] 
1  [0, 40, 6] 
dtype: object 

選項2
醜陋但速度更快,見下文

pd.Series((np.array(A.values.tolist()) - B.values[:, None]).tolist(), A.index) 

0 [31, 32, 37] 
1  [0, 40, 6] 
dtype: object 

時機

enter image description here

+1

我也喜歡這個! – MaxU

+0

你能解釋一下'A.apply(np.asarray) - B'部分的大熊貓新手?這只是簡單地將它轉換成一個數組(我認爲'np.'是numpy?)?如果是這樣,爲什麼會選擇其他選項的numpy數組?謝謝! – patrick

+2

@patrick'apply'需要一個函數作爲參數,並將其應用於該系列'A'的每個元素。它會產生另一系列的所有相同的行索引,而不是'A'的舊值,而是'np.asarray(x)',而'x'是'A'中的任何一個特定值。我們幾乎總是以'np'的形式導入numpy。 Grr的'np.array'工作非常相似。 – piRSquared