迭代、选择和计算数据帧中的不同索引

我有一个大数据框,这里只是示例数据:


length force   d1  d2  d3  d4

1   5000    300 300 300 300

1.2 5000    300 300 300 300

1.4 5000    300 300 300 300

1.6 2000    500 300 100 300

1.8 2000    600 300 200 300

2   3500    500 300 300 300

2.2 3500    300 300 300 300

2.4 3500    100 300 300 300

2.5 1500    100 400 200 300

2.6 1500    200 300 200 300

3   6000    200 200 200 100


我有四个参数 - d1, d2, d3 and d4. 我想遍历它们并找到一行和 (row-1) 之间的差异。对于两个参数,这种差异至少应出现在一行中(不能更多,也可以更少)。我想我会向数据框中添加一个新列,d1_test, d2_test, d3_test, d4_test如下所示:


df['d1_test'] = df['d1'].diff() != 0


所以我会得到:


length force   d1  d2  d3  d4  d1_test d2_test d3_test 4_test

1   5000    300 300 300 300 False   False   False   False

1.2 5000    300 300 300 300 False   False   False   False

1.4 5000    300 300 300 300 False   False   False   False

1.6 2000    500 300 100 300 True    False   True    False

1.8 2000    600 300 200 300 True    False   True    False

2   3500    500 300 300 300 True    False   True    False

2.2 3500    300 300 300 300 True    False   False   False

2.4 3500    100 300 300 300 True    False   False   False

2.5 1500    100 400 200 300 False   True    True    False

2.6 1500    200 300 200 300 True    True    False   False

3   6000    200 200 400 100 False   True    False   True


让我们考虑每个参数(d1, d2, d3, d4)也代表一个固定值:d1_pos = 30, d2_pos = 40, d3_pos=60, d4_pos=90.


然后是我想不通的部分。我想添加一个新列(带计算),例如df['result']当 d1-d4_test 中的两个为真时查找。我可以用布尔 sum() 来做到这一点,所以什么时候sum==2但我不知道哪两个参数是真。


在df['result']我想要这样的东西:


if d1_test AND d2_test = True:

          df['force'] / (d2_pos - d1_pos)

     elif d1_test AND d3_test = True:

          df['force'] / (d3_pos - d1_pos)

     elif d1_test AND d4_test = True:

          df['force'] / (d4_pos - d1_pos)

对于所有其他组合也类似。我不认为这是正确的方法,因为我最终得到了许多组合。如果参数数量发生变化,例如如果我添加d5, d6, d7.

我也尝试过groupby()对数据进行切片,但无法真正弄清楚。我确定那里有更好的解决方案?我希望这是可以理解的。非常感谢。


胡说叔叔
浏览 159回答 2
2回答

慕标琳琳

di只要您查找只有 2 的行,此方法就可以适用于任意数量的列True,假设您有di_pos某处的列表list_pos = [30, 40, 60, 90] # [d1_pos ,d2_pos ...# Use `filter`, `diff` and `values` to get all the values of the columns di_test at once arr_bool = (df.filter(like='d').diff() !=0).values#create a mask where the sum in each row is equal to 2mask = arr_bool.sum(1) == 2#get the values in the rows using the list list_pos  and the maskarr_val = list_pos *arr_bool[mask]#create the column result using df.loc[mask,'result'] = df.loc[mask,'force']/(arr_val[arr_val .nonzero()][1::2] -                                              arr_val [arr_val .nonzero()][0::2])print (df)    length  force   d1   d2   d3   d4      result0      1.0   5000  300  300  300  300         NaN1      1.2   5000  300  300  300  300         NaN2      1.4   5000  300  300  300  300         NaN3      1.6   2000  500  300  100  300   66.6666674      1.8   2000  600  300  200  300   66.6666675      2.0   3500  500  300  300  300  116.6666676      2.2   3500  300  300  300  300         NaN7      2.4   3500  100  300  300  300         NaN8      2.5   1500  100  400  200  300   75.0000009      2.6   1500  200  300  200  300  150.00000010     3.0   6000  200  200  200  100  120.000000
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python