Python Pandas:使用apply()从数组中减去一个值

5

我想使用pandas的apply()函数来代替对数据帧中每一行进行迭代,根据我的了解,这是更高效的方法。

我想要做的很简单:

temp_arr = [0,1,2,3]
# I know this is not a dataframe, just want to show quickly how it looks like.
temp_df is a 4x4 dataframe, simply: [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]]
For each row in my temp_df, minus the corresponding number in the temp_arr. 

比如说,我的数据框的第一行是[1,1,1,1],我想把它们减去temp_arr的第一个项(为0),那么输出应该是[1,1,1,1]。第二行是[2,2,2,2],我要从它们中减去temp_arr的第二项(为1),所以输出也应该是[1,1,1,1]。

如果我要减去一个常数,我知道可以轻松做到这一点:

temp_df.apply(lambda x: x-1)

但是这里的棘手之处在于我需要遍历我的temp_arr来获取减去的数字。有没有一种方法可以使用apply()完成这个操作?


[[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]] 不是 DataFrame,而是一个列表。 - user554546
我只是没有完全写出pd.Dataframe()部分,只是想快速展示数据框的外观,而不添加所有代码。 - Heavy Breathing
那为什么不将 temp_arr 转换成一个 Series,然后从你的行中减去它呢? - user554546
2个回答

5
考虑数组a和数据框df
a = np.arange(4)
df = pd.DataFrame(np.repeat([1, 2, 3, 4], 4).reshape(4, -1))

print(a)

[0 1 2 3]

print(df)

   0  1  2  3
0  1  1  1  1
1  2  2  2  2
2  3  3  3  3
3  4  4  4  4

您想使用 pd.DataFrame.sub 并设置 axis=0
这将使您的数组与 axis=0 或索引对齐,并逐列执行减法运算。

print(df.sub(a, axis=0))

   0  1  2  3
0  1  1  1  1
1  1  1  1  1
2  1  1  1  1
3  1  1  1  1

额外加分项
使用numpy的广播功能来对齐轴。

 print(df.values - a[:, None])

[[1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]
 [1 1 1 1]]

构建数据框。
d1 = pd.DataFrame(df.values - a[:, None], df.index, df.columns)
print(d1)

   0  1  2  3
0  1  1  1  1
1  1  1  1  1
2  1  1  1  1
3  1  1  1  1

非常优雅的解决方案!我不知道有数据框减法和sub函数(两者似乎完全相同...)!谢谢! - Heavy Breathing
df1 - df2df1.sub(df2, axis=1) 相同。通过直接访问 sub 方法,您可以更改 axis 参数。 - piRSquared

0

使用索引逐行应用到另一个数据框:

import numpy as np
import pandas as pd
df = pd.DataFrame(data = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]])    
a = pd.DataFrame({'a': np.arange(4), 'b': np.arange(1, 5)})
print df.apply(lambda x: x - a.ix[x.index, 'a'], axis = 1)
print df.apply(lambda x: x - a.ix[x.index, 'b'], axis = 1)

回答原问题:

import numpy as np
import pandas as pd
term_df = pd.DataFrame(data = [[1,1,1,1],[2,2,2,2],[3,3,3,3],[4,4,4,4]])    
temp_arr = np.arange(4)
print temp_df.apply(lambda x: x - temp_arr[x.index], axis = 1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接