установите grh
& anc
в качестве индекса, поскольку мы ищем индекс в столбцах anc[1-9]
. Это также удобно, когда мы записываем выходные столбцы:
df2 = df.set_index(['grh', 'anc'])
для каждого среза строки в столбцы, используя значение anc
, которое теперь находится в индексе, принимая 3 смежных значения, преобразуем их для серии с именами, как вы ожидаете в выходных данных, и назначьте их соответствующим выходным столбцам
outcols = ['lap1', 'lap2', 'lap3']
df2[outcols] = df2.apply(lambda x: pd.Series(x[x.name[1]-1:x.name[1]+2].values, index=outcols), axis=1)
df2 выглядит следующим образом:
anc1 anc2 anc3 anc4 anc5 anc6 anc7 anc8 anc9 anc10 lap1 lap2 lap3
grh anc
2 5 0.10000 0.12000 0.1800 0.14000 0.15000 0.1900 0.20000 0.10000 0.21000 0.24000 0.15000 0.19000 0.20000
3 7 0.03299 0.05081 0.0355 0.02884 0.03054 0.0332 0.03115 0.02177 0.04903 0.04399 0.03115 0.02177 0.04903
4 3 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
5 4 0.00000 0.00000 0.0000 0.00000 0.00000 0.0000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000 0.00000
6 1 0.10000 0.10000 0.1000 0.10000 0.10000 0.1000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000 0.10000
сбросьте индекс еще раз, если вы хотите вернуться grh
& anc
обратно к столбцам.
альтернативный поиск на основе имени вместо позиционного поиска:
определяет вспомогательную функцию для выполнения поиска по столбцу при условии плавающей запятой , Он должен принимать число с плавающей запятой, потому что pandas будет автоматически выгружать int64 в число с плавающей запятой, если ряд содержит какие-либо нецелые значения. Используйте эту функцию, чтобы выполнить поиск и назначить вывод. Одним из преимуществ этого подхода является то, что set_index
не требуется.
def cols(n,p): return [f'{p}{i}' for i in range(int(n), int(n+3))]
df[cols(1, 'lap')] = df.apply(lambda x: pd.Series(x[cols(x.anc, 'anc')].values), axis=1)