为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡说叔叔 2021-09-02 16:21:01
我有一个大数据框,这里只是示例数据:length force   d1  d2  d3  d41   5000    300 300 300 3001.2 5000    300 300 300 3001.4 5000    300 300 300 3001.6 2000    500 300 100 3001.8 2000    600 300 200 3002   3500    500 300 300 3002.2 3500    300 300 300 3002.4 3500    100 300 300 3002.5 1500    100 400 200 3002.6 1500    200 300 200 3003   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_test1   5000    300 300 300 300 False   False   False   False1.2 5000    300 300 300 300 False   False   False   False1.4 5000    300 300 300 300 False   False   False   False1.6 2000    500 300 100 300 True    False   True    False1.8 2000    600 300 200 300 True    False   True    False2   3500    500 300 300 300 True    False   True    False2.2 3500    300 300 300 300 True    False   False   False2.4 3500    100 300 300 300 True    False   False   False2.5 1500    100 400 200 300 False   True    True    False2.6 1500    200 300 200 300 True    True    False   False3   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()对数据进行切片,但无法真正弄清楚。我确定那里有更好的解决方案?我希望这是可以理解的。非常感谢。
查看完整描述

2 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

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 2

mask = arr_bool.sum(1) == 2


#get the values in the rows using the list list_pos  and the mask

arr_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      result

0      1.0   5000  300  300  300  300         NaN

1      1.2   5000  300  300  300  300         NaN

2      1.4   5000  300  300  300  300         NaN

3      1.6   2000  500  300  100  300   66.666667

4      1.8   2000  600  300  200  300   66.666667

5      2.0   3500  500  300  300  300  116.666667

6      2.2   3500  300  300  300  300         NaN

7      2.4   3500  100  300  300  300         NaN

8      2.5   1500  100  400  200  300   75.000000

9      2.6   1500  200  300  200  300  150.000000

10     3.0   6000  200  200  200  100  120.000000


查看完整回答
反对 回复 2021-09-02
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信