Python 检索熊猫中的数据
我使用pandas和Outlot从.root文件读取数据,得到如下表: 上述表格由以下代码组成:Python 检索熊猫中的数据,python,pandas,physics,uproot,Python,Pandas,Physics,Uproot,我使用pandas和Outlot从.root文件读取数据,得到如下表: 上述表格由以下代码组成: fname = 'ZZ4lAnalysis_VBFH.root' key = 'ZZTree/candTree' ttree = uproot.open(fname)[key] branches = ['Z1Flav', 'Z2Flav', 'nCleanedJetsPt30', 'LepPt', 'LepLepId'] df = ttree.pandas.df(branches, flatt
fname = 'ZZ4lAnalysis_VBFH.root'
key = 'ZZTree/candTree'
ttree = uproot.open(fname)[key]
branches = ['Z1Flav', 'Z2Flav', 'nCleanedJetsPt30', 'LepPt', 'LepLepId']
df = ttree.pandas.df(branches, flatten=False)
我需要在LepPt中找到最大值,一旦找到最大值,我还需要检索该最大值的lepid。
我很容易找到最大值:
Pt_l1 = [max(i) for i in df.LepPt]
这样我得到一个包含所有最大值的数组。但是,我必须根据lepid来分离这些值。所以我需要一个最大LepPt和| lepid |=11的数组,以及一个最大LepPt和| lepid |=13的数组
如果有人能给我任何提示、建议和/或建议,我将不胜感激 我制作了一些模拟数据,因为您没有以任何简单的格式提供您的数据。我想这就是你要找的
import pandas as pd
df = pd.DataFrame.from_records(
[ [[1,2,3], [4,5,6]],
[[4,6,5], [7,8,9]]
],
columns=['LepPt', 'LepLepld']
)
df['max_LepPt'] = [max(i) for i in df.LepPt]
def f(row):
# get index position within list
pos = row['LepPt'].index(row['max_LepPt']).tolist()
return row['LepLepld'][pos]
df['same_index_LepLepld'] = df.apply(lambda x: f(x), axis=1)
返回:
LepPt LepLepld max_LepPt same_index_LepLepld
0 [1, 2, 3] [4, 5, 6] 3 6
1 [4, 6, 5] [7, 8, 9] 6 8
您可以使用该接口来实现这一点(《代码》)的一个依赖项,它允许您使用大小不规则的数组
为此,您需要稍微更改加载数据的方式,但它允许您使用与普通numpy
数组相同的方法,即:
然后,这只是一个普通的numpy
数组,如果需要,可以将其分配给pandas
数据帧的一列。它应该具有正确的维度和顺序。它还应该比使用内置Python函数更快
请注意,键是ByTestRing,而不是普通字符串,如果存在没有轻子的事件,则必须执行一些额外的步骤(在这种情况下,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()
如果以后不再需要列,则前者会更快,否则后者可能更好。
groupby
或idxmax
除非绝对必要,否则请勿将信息作为图像共享。看:你试过什么,做过什么研究吗?你在挣扎哪一部分?我也很好奇为什么要存储列表或数组,而不是将每个元素都存储在一列中!是的,那正是我需要的。我只有一个问题,我得到了AttributeError:*(“'numpy.ndarray'对象没有属性'index',u'出现在索引0')**。有什么问题吗?对不起,我以前用C++编写代码,我对Python是新的,所以我根本不懂这种语言。抢手货
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()