Получить данные из Pandas multiIndex - PullRequest
2 голосов
/ 04 февраля 2020

Я использую pandas и up root для чтения данных из файла. root, и я получаю таблицу, подобную следующей:

таблица

Итак, из моего файла. root у меня есть несколько ветвей дерева.

fname = 'ZZ4lAnalysis_VBFH.root' 
key = 'ZZTree/candTree'
ttree = uproot.open(fname)[key]
branches = ['nCleanedJets', 'JetPt', 'JetMass', 'JetPhi'] 
df = ttree.pandas.df(branches, entrystop=40306)

По сути, мне нужно извлекать данные «JetPhi» для каждой записи, в которой имеется более 2 подстатей (или, что эквивалентно, записей, для которых «nCleanedJets» равен или больше 2), вычисляя Разница «JetPhi» между первыми двумя подстатьями, а затем составить гистограмму для таких различий.

Я попытался найти в inte rnet и пробовал разные возможности, но я не нашел никакого полезного решения. Если бы кто-то мог дать мне любой намек, совет и / или предложение, я был бы очень благодарен. Я имел обыкновение кодировать в C ++, и я новичок в python.

Я имел обыкновение кодировать в C ++, поэтому я новичок в python, и я все еще не осваиваю этот язык.

1 Ответ

1 голос
/ 04 февраля 2020

Вы можете сделать это в Pandas с помощью

df[df["nCleanedJets"] >= 2]

, поскольку у вас есть столбец с количеством записей. Выражение df["nCleanedJets"] >= 2 возвращает логическое значение Series (True, если строка проходит, False, если строка не проходит) и передачу массива Series или NumPy в виде среза в квадратных скобках масок. этим массивом (возвращая строки, для которых логический массив равен True).

Вы также можете сделать это в Awkward Array перед преобразованием в Pandas, что было бы проще, если бы у вас не было "nCleanedJets" столбец.

array = ttree.arrays(branches, entrystop=40306)
selected = array[array.counts >= 2]

awkward.topandas(selected, flatten=True)

Маскировка в Awkward Array следует тому же принципу, но со структурами данных вместо плоских Series или NumPy массивов (каждый элемент array представляет собой список записей с "nCleanedJets", "JetPt", "JetPhi", "JetMass" и counts - длина каждого списка).

awkward.topandas с flatten=True эквивалентно тому, что до root делает, когда outputtype=pandas.DataFrame и flatten=True (по умолчанию ttree.pandas.df).

...