索引Pandas Dataframe :整数行,命名列

c0vxltue  于 2023-02-17  发布在  其他
关注(0)|答案(6)|浏览(213)

假设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]

pprl5pva

pprl5pva1#

这是一个迟来的回答,但@unutbu的评论仍然有效,是解决这个问题的一个很好的办法。
要为具有整数行和命名列(标记列)的数据框编制索引:
df.loc[df.index[#], 'NAME'],其中#是有效的整数索引,NAME是列的名称。

ergxz8rk

ergxz8rk2#

现有的答案在我看来是短视的。

问题解决方案

  1. df.loc[df.index[0], 'a']
    这里的策略是获取第0行的行标签,然后正常使用.loc
    1.如果df具有重复的行标签,则df.loc[df.index[0], 'a']可能返回多行。
  2. .loc.iloc慢,因此您在这里牺牲了速度。
  3. df.reset_index(drop=True).loc[0, 'a']
    这里的策略是重置索引,使行标签变为0,1,2,......这样.loc[0]就给出了与.iloc[0]相同的结果。不过,这里的问题是运行时,因为.loc.iloc慢,而且重置索引会产生开销。

更好的解决方案

我建议按照@Landmaster的评论去做:

df.iloc[0, df.columns.get_loc("a")]

本质上,这与df.iloc[0, 0]相同,只是我们使用df.columns.get_loc("a")动态获取列索引。
要索引多个列(如['a', 'b', 'c']),请用途:

df.iloc[0, [df.columns.get_loc(c) for c in ['a', 'b', 'c']]]

更新

这是作为我的course on Pandas的一部分讨论的here

dba5bblo

dba5bblo3#

这个答案很晚才给出,但让我惊讶的是,这么多年过去了,Pandas仍然没有这样的功能。如果你觉得很烦,你可以在DataFrame中安装一个自定义索引器:

class XLocIndexer:
    def __init__(self, frame):
        self.frame = frame
    
    def __getitem__(self, key):
        row, col = key
        return self.frame.iloc[row][col]

pd.core.indexing.IndexingMixin.xloc = property(lambda frame: XLocIndexer(frame))

# Usage
df.xloc[0, 'a'] # one
xa9qqrwz

xa9qqrwz4#

要通过行列标签获取或设置DataFrame中的 * 单个 * 值,最好使用DataFrame.at而不是DataFrame.loc,因为它是...
1.更快
1.您更明确地表示只想访问单个值。
其他人已经展示了,如果你从整数位置开始,你仍然需要先用DataFrame.index找到row-label,因为DataFrame.at只接受标签:

df.at[df.index[0], 'a']
# Out: 'three'

基准:

%timeit df.at[df.index[0], 'a']
# 7.57 µs ± 30.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit df.loc[df.index[0], 'a']
# 10.9 µs ± 53.3 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
%timeit df.iloc[0, df.columns.get_loc("a")]
# 13.3 µs ± 24 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

完整性:
DataFrame.iat,用于按整数位置访问行/列对的单个值。

whitzsjs

whitzsjs5#

我们可以重置索引,然后像这样使用基于0的索引
df.reset_index(drop=True).loc[0,'a']
编辑:从列名称索引'a'中删除了[],因此它只输出值

30byixjq

30byixjq6#

像df[“a”][0]这样的东西对我来说很好用。你可以试试!

相关问题