![](/img/trans.png)
[英]Using .diff() on Pandas DataFrame to subtract *list* elements
[英]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.