【问题标题】:Python Pandas: Using apply() to subtract a value from an arrayPython Pandas:使用 apply() 从数组中减去一个值
【发布时间】:2016-12-29 19:26:23
【问题描述】:

我想使用 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]] 不是数据帧。这是一个列表。
  • 我只是没有写出整个 pd.Dataframe() 位。我只是想快速展示数据框的外观,而无需添加所有代码。
  • 好吧,为什么不把temp_arr 变成一个系列,然后从你的行中减去呢?

标签: python pandas numpy


【解决方案1】:

考虑数组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.subaxis=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

【讨论】:

  • 非常优雅的解决方案!我不知道数据框减法和子功能(两者似乎彼此相同......)!谢谢!
  • df1 - df2df1.sub(df2, axis=1) 相同。通过直接访问sub 方法,您可以更改axis 参数。
【解决方案2】:

使用索引按行应用以引用另一个数据框:

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-17
    • 2013-02-21
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多