假设df
是一个panda Dataframe 。
df.loc[]
只接受名称df.iloc[]
仅接受整数(实际位置)df.ix[]
接受名称和整数:
当引用行时,df.ix[row_idx, ]
只希望被赋予名称。
df = pd.DataFrame({'a' : ['one', 'two', 'three','four', 'five', 'six'],
'1' : np.arange(6)})
df = df.ix[2:6]
print(df)
1 a
2 2 three
3 3 four
4 4 five
5 5 six
df.ix[0, 'a']
抛出一个错误,它不会给予'two'。
引用列时,iloc首选整数,而不是名称。
df.ix[2, 1]
返回'three',而不是2。(尽管df.idx[2, '1']
确实返回2
)。
奇怪的是,我喜欢完全相反的功能,通常我的列名是非常有意义的,所以在我的代码中我直接引用它们,但由于大量的观察清理,我的Pandas数据框中的行名称通常不对应于range(len(df))
。
我意识到我可以用途:
df.iloc[0].loc['a'] # returns three
但是看起来很难看!有没有人知道更好的方法来做这件事,让代码看起来像这样?
df.foo[0, 'a'] # returns three
事实上,是否可以将我自己的新方法添加到pandas.core.frame.DataFrame
s中,例如df.idx(rows, cols)
实际上是df.iloc[rows].loc[cols]
?
6条答案
按热度按时间pprl5pva1#
这是一个迟来的回答,但@unutbu的评论仍然有效,是解决这个问题的一个很好的办法。
要为具有整数行和命名列(标记列)的数据框编制索引:
df.loc[df.index[#], 'NAME']
,其中#
是有效的整数索引,NAME
是列的名称。ergxz8rk2#
现有的答案在我看来是短视的。
问题解决方案
df.loc[df.index[0], 'a']
这里的策略是获取第0行的行标签,然后正常使用
.loc
。1.如果
df
具有重复的行标签,则df.loc[df.index[0], 'a']
可能返回多行。.loc
比.iloc
慢,因此您在这里牺牲了速度。df.reset_index(drop=True).loc[0, 'a']
这里的策略是重置索引,使行标签变为0,1,2,......这样
.loc[0]
就给出了与.iloc[0]
相同的结果。不过,这里的问题是运行时,因为.loc
比.iloc
慢,而且重置索引会产生开销。更好的解决方案
我建议按照@Landmaster的评论去做:
本质上,这与
df.iloc[0, 0]
相同,只是我们使用df.columns.get_loc("a")
动态获取列索引。要索引多个列(如
['a', 'b', 'c']
),请用途:更新
这是作为我的course on Pandas的一部分讨论的here。
dba5bblo3#
这个答案很晚才给出,但让我惊讶的是,这么多年过去了,Pandas仍然没有这样的功能。如果你觉得很烦,你可以在DataFrame中安装一个自定义索引器:
xa9qqrwz4#
要通过行列标签获取或设置
DataFrame
中的 * 单个 * 值,最好使用DataFrame.at
而不是DataFrame.loc
,因为它是...1.更快
1.您更明确地表示只想访问单个值。
其他人已经展示了,如果你从整数位置开始,你仍然需要先用
DataFrame.index
找到row-label,因为DataFrame.at
只接受标签:基准:
完整性:
DataFrame.iat
,用于按整数位置访问行/列对的单个值。whitzsjs5#
我们可以重置索引,然后像这样使用基于0的索引
df.reset_index(drop=True).loc[0,'a']
编辑:从列名称索引
'a'
中删除了[]
,因此它只输出值30byixjq6#
像df[“a”][0]这样的东西对我来说很好用。你可以试试!