Для этого вы можете использовать интерфейс awkward.JaggedArray
(одна из зависимостей uproot
), который позволяет иметь массивы неправильного размера.
Для этого вам понадобится немного изменить способ загрузки данных, но он позволяет использовать те же методы, которые вы использовали бы с обычным массивом numpy
, а именно argmax
:
fname = 'ZZ4lAnalysis_VBFH.root'
key = 'ZZTree/candTree'
ttree = uproot.open(fname)[key]
# branches = ['Z1Flav', 'Z2Flav', 'nCleanedJetsPt30', 'LepPt', 'LepLepId']
branches = ['LepPt', 'LepLepId'] # to save memory, only load what you need
# df = ttree.pandas.df(branches, flatten=False)
a = ttree.arrays(branches) # use awkward array interface
max_pt_idx = a[b'LepPt'].argmax()
max_pt_lepton_id = a[b'LepLepld'][max_pt_idx].flatten()
Тогда это просто обычный массив numpy
, который вы можете назначить столбцу pandas
кадра данных, если хотите. Он должен иметь правильную размерность и порядок. Это также должно быть быстрее, чем использование встроенных функций Python.
Обратите внимание, что ключи являются строками байтов, а не обычными строками, и вам придется предпринять некоторые дополнительные шаги, если есть события без лептонов (в этом случае flatten
будет игнорировать эти пустые события, разрушая выравнивание).
В качестве альтернативы, вы также можете впоследствии преобразовать столбцы:
import awkward
df = ttree.pandas.df(branches, flatten=False)
max_pt_idx = awkward.fromiter(df["LepPt"]).argmax()
lepton_id = awkward.fromiter(df["LepLepld"])
df["max_pt_lepton_id"] = lepton_id[max_pt_idx].flatten()
Первый будет быстрее, если впоследствии вам больше не понадобятся столбцы, иначе последний может быть лучше.