【发布时间】:2015-04-29 13:08:03
【问题描述】:
说df 是一个熊猫数据框。
-
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']
抛出一个错误,它不会返回“二”。
当引用列时,iloc 更喜欢整数,而不是名称。例如
df.ix[2, 1]
返回“三”,而不是 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.DataFrames,例如
df.idx(rows, cols)其实就是df.iloc[rows].loc[cols]?
【问题讨论】:
-
你可以使用
df['a'].iloc[0]。 -
另见GH 9213,它建议
df.loc[df.index[0], 'a']。这有advantage of not using chained indexing,这意味着它可以在进行分配时工作,而df[['a','b']].iloc[0] = val不会。 -
并不能真正解决您的问题,但这里的答案非常好:stackoverflow.com/questions/31593201/…
-
或者反过来:df.iloc[0, df.columns.get_loc("a")]