У меня большой массив данных, вот только примерные данные:
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
, но я не могу знать, какие два параметра имеют значение True.
В 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
.
Ожидаемый результат:
length force d1 d2 d3 d4 d1_test d2_test d3_test 4_test result
1 5000 300 300 300 300 FALSE FALSE FALSE FALSE NaN
1.2 5000 300 300 300 300 FALSE FALSE FALSE FALSE NaN
1.4 5000 300 300 300 300 FALSE FALSE FALSE FALSE NaN
1.6 2000 500 300 100 300 TRUE FALSE TRUE FALSE 66.66666667
1.8 2000 600 300 200 300 TRUE FALSE TRUE FALSE 66.66666667
2 3500 500 300 300 300 TRUE FALSE TRUE FALSE 116.7
2.2 3500 300 300 300 300 TRUE FALSE FALSE FALSE Nan
2.4 3500 100 300 300 300 TRUE FALSE FALSE FALSE NaN
2.5 1500 100 400 200 300 FALSE TRUE TRUE FALSE 75
2.6 1500 200 300 200 300 TRUE TRUE FALSE FALSE 150
3 6000 200 200 400 100 FALSE TRUE FALSE TRUE 120
Я также пытался с groupby()
и разрезать данные, но не могу понять это.Я уверен, что есть лучшее решение?Надеюсь это понятно.Большое спасибо.