如何更优雅访问Pandas拼接后DataFrame第一行指定元素?
优雅访问多层列DataFrame指定元素
我正在学习Pandas,尝试访问拼接后的多层列DataFrame中accel组x列第一行的元素,当前使用的方法较为繁琐,请问是否有更优雅的实现方式?
用户当前实现代码:
import numpy as np import pandas as pd accel = [[-0.7437,0.1118,-0.6367], [-0.7471,0.1162,-0.6338], [-0.7437,0.1216,-0.6255]] accel = np.array(accel,dtype=float) angle = [[169.4366,49.4714,56.9421], [169.3762,49.5374,56.8433], [169.2828,49.6582,56.7059]] angle = np.array(angle,dtype=float) avelo = [[-0.5493,-0.9766,1.4038], [0,-1.4038,0.7935], [0.061,-1.0986,0.2441]] avelo = np.array(avelo,dtype=float) # 修正原代码笔误 dfs = { 'accel': pd.DataFrame(accel, columns=list('xyz')), 'angle': pd.DataFrame(angle, columns=list('xyz')), 'avelo': pd.DataFrame(avelo, columns=list('xyz')) } df = pd.concat(dfs, axis=1) param = df['accel'] val = param.head() print(val['x'][0])
更优雅的实现方式
concat后生成的是**多层列索引(MultiIndex)**的DataFrame,直接利用多层索引特性可以一步到位:
- 用
iloc按位置访问(推荐)
print(df['accel', 'x'].iloc[0])
直接通过元组('accel', 'x')定位目标列,再用iloc[0]取第一行元素,避免链式索引可能引发的警告。
- 用
loc按标签访问
print(df.loc[0, ('accel', 'x')])
loc支持同时指定行标签和列的多层索引元组,语义更清晰,适合行标签非整数的场景。
- 动态定位列位置
print(df.iloc[0, df.columns.get_loc(('accel', 'x'))])
先通过get_loc获取目标列的位置,再用iloc定位行和列,适合需要动态生成索引的场景。
额外优化点
- 原代码中
avelo - np.array(avelo,dtype=float)是笔误,应改为avelo = np.array(avelo,dtype=float),否则后续生成DataFrame会报错。 - 原代码中
param = df['accel']; val = param.head(); print(val['x'][0])属于冗余步骤,链式索引还可能触发SettingWithCopyWarning,建议直接用上述方法替代。
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

