我想使用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()做任何方式吗?
答案 0 :(得分:4)
考虑数组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
答案 1 :(得分: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)