为什么我们将'loc'用于pandas数据帧?似乎以下代码使用或不使用loc编译anr以相同的速度运行
%timeit df_user1 = df.loc[df.user_id=='5561']
100 loops, best of 3: 11.9 ms per loop
Run Code Online (Sandbox Code Playgroud)
要么
%timeit df_user1_noloc = df[df.user_id=='5561']
100 loops, best of 3: 12 ms per loop
Run Code Online (Sandbox Code Playgroud)
那么为什么要使用loc?
编辑:这已被标记为重复的问题.但是,虽然pandas iloc vs ix vs loc解释?确实提到*
你可以只使用数据框的getitem进行列检索 :
*
df['time'] # equivalent to df.loc[:, 'time']
Run Code Online (Sandbox Code Playgroud)
它没有说明为什么我们使用loc,虽然它确实解释了loc的许多功能,但我的具体问题是"为什么不完全省略loc"?我已经接受了以下非常详细的答案.
还有其他帖子的答案(我认为不是答案)在讨论中非常隐藏,任何寻找我正在寻找的人都会发现很难找到信息,而且提供的答案会更好我的问题.
我已经做了一些寻找这个问题的答案,但我能弄清楚的是:
df[df.columns[len(df.columns)-1]]
Run Code Online (Sandbox Code Playgroud)
对我来说,这似乎是unweildy,而不是pythonic(和慢?).
在没有指定列名的情况下,为pandas数据帧中的最后一列选择数据的最简单方法是什么?
我注意到在Pandas DataFrame中选择一个列的三种方法:
使用loc选择列的第一种方法:
df_new = df.loc[:, 'col1']
Run Code Online (Sandbox Code Playgroud)
第二种方法 - 看起来更简单,更快捷:
df_new = df['col1']
Run Code Online (Sandbox Code Playgroud)
第三种方法 - 最方便:
df_new = df.col1
Run Code Online (Sandbox Code Playgroud)
这三种方法有区别吗?我不这么认为,在这种情况下我宁愿使用第三种方法.
我很好奇为什么似乎有三种方法可以做同样的事情.
Say 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']
Run Code Online (Sandbox Code Playgroud)
抛出错误,它不会返回'两个'.
在引用列时,iloc更喜欢整数,而不是名称.例如
df.ix[2, 1]
Run Code Online (Sandbox Code Playgroud)
返回'三',而不是2.(虽然df.idx[2, '1']确实返回2).
奇怪的是,我想要完全相反的功能.通常我的列名非常有意义,所以在我的代码中我直接引用它们.但是由于大量的观察清理,我的pandas数据框中的行名通常不对应range(len(df)).
我意识到我可以使用:
df.iloc[0].loc['a'] # returns three
Run Code Online (Sandbox Code Playgroud)
但它看起来很难看!有没有人知道更好的方法来做到这一点,所以代码看起来像这样?
df.foo[0, 'a'] # returns three
Run Code Online (Sandbox Code Playgroud)
事实上,是否有可能将自己的新方法添加到pandas.core.frame.DataFrames,所以例如
df.idx(rows, cols)实际上是df.iloc[rows].loc[cols]?
SettingWithCopyWarning在我不期望它们的情况下我会遇到错误:
N.In <38>: # Column B does not exist yet
N.In <39>: df['B'] = df['A']/25
N.In <40>: df['B'] = df['A']/50
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = s
Run Code Online (Sandbox Code Playgroud)
和
N.In <41>: df.loc[:,'B'] = df['A']/50
/Users/josh/anaconda/envs/py27/lib/python2.7/site-packages/pandas/core/indexing.py:389: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_index,col_indexer] = value instead
self.obj[item] = …Run Code Online (Sandbox Code Playgroud) 假设我们有一个 pandas 数据框:
name age sal
0 Alex 20 100
1 Jane 15 200
2 John 25 300
3 Lsd 23 392
4 Mari 21 380
Run Code Online (Sandbox Code Playgroud)
假设现在删除了几行,但我们不知道已删除的索引。例如,我们使用 删除行索引 1 df.drop([1])。现在数据框可以归结为:
fname age sal
0 Alex 20 100
2 John 25 300
3 Lsd 23 392
4 Mari 21 380
Run Code Online (Sandbox Code Playgroud)
我想从行索引 3 和列“年龄”获取值。它应该返回 23。我该怎么做?
df.iloc[3, df.columns.get_loc('age')]不起作用,因为它将返回 21。我猜 iloc 采用连续行索引?
我一直在使用熊猫有一段时间了,我明白了什么loc和iloc做。但是直到今天,我都不知道这两件事是否代表某种意义?他们是某种缩写还是缩写?还是只是随机的?
我将其解释iloc为“基于索引的位置”,这很有意义,但loc对我来说有点问题,我将其解释为“位置”,但没有喊出“基于标签的位置”,为什么他们不能称之为“基于标签的位置” lloc?
假设我想要一个函数来更改DataFrame的给定行号中的命名列的值.
一种选择是找到列的位置并使用iloc,如下所示:
def ChangeValue(df, rowNumber, fieldName, newValue):
columnNumber = df.columns.get_loc(fieldName)
df.iloc[rowNumber, columnNumber] = newValue
Run Code Online (Sandbox Code Playgroud)
但是我想知道是否有办法一次性使用iloc和loc的魔法,并跳过手动转换.
有任何想法吗?
我试图使用列表从Pandas数据帧中提取行,但无法完成.这是一个例子
# df
alleles chrom pos strand assembly# center protLSID assayLSID
rs#
TP3 A/C 0 3 + NaN NaN NaN NaN
TP7 A/T 0 7 + NaN NaN NaN NaN
TP12 T/A 0 12 + NaN NaN NaN NaN
TP15 C/A 0 15 + NaN NaN NaN NaN
TP18 C/T 0 18 + NaN NaN NaN NaN
test = ['TP3','TP12','TP18']
df.select(test)
Run Code Online (Sandbox Code Playgroud)
这就是我试图用列表中的元素做的事情,我收到了这个错误TypeError: 'Index' object is not callable.我究竟做错了什么?
因此,.loc和.iloc不是您的典型函数。他们以某种方式使用[和]包围参数,以便与普通数组索引相当。但是,我从来没有在另一个库中看到过这一点(我可以想到,也许numpy就是我正在空白的东西),而且我不知道它在技术上是如何工作的/是在python代码中定义的。
在这种情况下,方括号只是函数调用的语法糖吗?如果是这样,那么如何使一个任意函数使用方括号而不是括号呢?否则,它们的使用/定义熊猫有何特别之处?
谢谢。