繁体   English   中英

使用列表减去熊猫数据框以在每次迭代中选择不同的列

[英]Subtract pandas dataframe using list to choose diferent columns in each iteration

我正在尝试将列表用作 Dataframe 减法操作中的索引。 但是我收到以下错误:无法使用这些索引器对索引进行位置索引

我有这两个数据框:

df1

指数 t1 t2 t3 t4 t5 ... t950
一,1 0,00001 0,00002 0,00003 0,00004 0,00008 ... 0,00004
a2 0,00001 0,00002 0,00003 0,00005 0,00007 ... 0,00004
b,1 0,00004 0,00003 0,00002 0,00006 0,00006 ... 0,00001
b,2 0,00005 0,00004 0,00003 0,00007 0,00005 ... 0,00002

df2

指数 t1 t2 t3 t4 t5 ... t950
一,1 0,00008 0,00007 0,00007 0,00006 0,00004 ... 0,00002
a2 0,00007 0,00006 0,00005 0,00004 0,00003 ... 0,00002
b,1 0,00002 0,00001 0,00002 0,00003 0,00004 ... 0,00004
b,2 0,00005 0,00006 0,00007 0,00008 0,00009 ... 0,00004

我也有一个列表,其中包括减去应该从哪里开始的每一列的索引:

index_col

[2,3,1,2]

我现在的代码如下:

result=df1.subtract(df2.iloc[:,index_col:].rename(columns=dict(zip(df2.iloc[:,index_col:].columns,df2.columns))

我的预期结果是:

指数 t1 t2 t3 t4 t5 ... t950
一,1 -0,00006 -0,00004 -0,00001 ... ... ... 0,00002
a2 -0,00003 -0,00001 ... ... ... ... 0,00002
b,1 -0,00003 -0,00001 0,00001 -0,00002 ... ... 0,00004
b,2 -0,00002 -0,00004 -0,00006 ... ... ... 0,00004

例如,在第一行中:

t1 - t3 // t2 - t4 // t3 - t5 因为在 df2 中它应该从第三列开始(正如第一个 index_col 值所反映的那样)。

你知道我如何在我的列表之后计算这个减法作为列索引吗? 我知道我可以通过循环来做到这一点,但我想尽量避免它并使用矢量化的力量。

非常感谢!

假设您想在行用完时减去 0。

shifts成为列表[2,3,1,2] ,你称之为 index_col。

可能不是最好/最优雅的解决方案,但我认为这会做你想要的:

import numpy as np
from scipy.ndimage import shift

shifted = np.vstack([shift(row, -k) for row, k in zip(df2.values, shifts)])
result = df1 - shifted

完整示例:

import numpy as np
import pandas as pd
from scipy.ndimage import shift


df1 = pd.DataFrame(np.random.random((4, 5)), index=list("ABCD"), columns=list("abcde"))
df2 = pd.DataFrame(np.random.random((4, 5)))
shifts = [2, 3, 1, 2]
>>> df1
          a         b         c         d         e
A  0.308420  0.591043  0.914204  0.407474  0.670670
B  0.371686  0.989710  0.823255  0.145337  0.437014
C  0.023323  0.590014  0.685122  0.558222  0.238016
D  0.996939  0.974608  0.117192  0.539702  0.622569

>>> df2
          0         1         2         3         4
0  0.825861  0.356216  0.668553  0.090403  0.915279
1  0.699088  0.239835  0.728388  0.143411  0.025266
2  0.600219  0.280567  0.267376  0.100538  0.511053
3  0.538059  0.705963  0.633112  0.138550  0.455539

>>> shifted = np.vstack([shift(row, -k) for row, k in zip(df2.values, shifts)])
>>> df1 - shifted
          a         b         c         d         e
A -0.360133  0.500640 -0.001074  0.407474  0.670670
B  0.228275  0.964444  0.823255  0.145337  0.437014
C -0.257244  0.322639  0.584583  0.047168  0.238016
D  0.363827  0.836059 -0.338347  0.539702  0.622569

如果您不想导入scipy ,您可以编写自己的shift函数:请参阅Shift elements in a numpy array

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM