2017-04-18 74 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