我正在尝试学习子集如何在pandas DataFrame中工作。我做了一个随机的数据帧,如下所示。

import pandas as pd
import numpy as np

np.random.seed(1234)
X = pd.DataFrame({'var1' : np.random.randint(1,6,5), 'var2' : np.random.randint(6,11,5),
                  'var3': np.random.randint(11,16,5)})
X = X.reindex(np.random.permutation(X.index))
X.iloc[[0,2], 1] = None


X返回,

   var1  var2  var3
0     3   NaN    11
4     3     9    13
3     2   NaN    14
2     5     9    12
1     2     7    13


熊猫方法.loc严格基于标签,而.iloc用于整数位置。 .ix可用于组合基于位置的索引和标签。

但是,在上面的示例中,行索引是整数,并且.ix将其理解为行索引而不是位置。假设我要检索“ var2”的前两行。在R中,X[1:2, 'var2']会给出答案。在Python中,X.ix[[0,1], 'var2']返回NaN 7而不是NaN 9

问题是“是否有一种简单的方法让.ix知道索引是基于位置的?”

我已经找到了一些解决方案,但是在某些情况下它们并不简单直观。

例如,通过使用下面的_slice(),我可以获得所需的结果。

>>> X._slice(slice(0, 2), 0)._slice(slice(1,2),1)
   var2
0   NaN
4     9


当行索引不是整数时,就没有问题。

>>> X.index = list('ABCED')
>>> X.ix[[0,1], 'var2']
A   NaN
B     9
Name: var2, dtype: float64

最佳答案

您可以使用X['var2'].iloc[[0,1]]

In [280]: X['var2'].iloc[[0,1]]
Out[280]:
0   NaN
4     9
Name: var2, dtype: float64




由于X['var2']X的视图,因此X['var2'].iloc[[0,1]]对于两者都是安全的
访问和分配。但请注意,如果您使用此“链接索引”
模式(例如此处使用的按列索引然后按索引iloc模式),因为它没有
归纳为多列分配的情况。

例如,X[['var2', 'var3']].iloc[[0,1]] = ...生成一个副本
X的sub-DataFrame,因此对此sub-DataFrame的分配不会修改X
有关更多说明,请参见"Why assignments using chained indexingfails"上的文档。

具体而言,并说明为什么该视图-复制-复制区别很重要:如果启用了此警告,则:

pd.options.mode.chained_assignment = 'warn'


然后此分配引发SettingWithCopyWarning警告:

In [252]: X[['var2', 'var3']].iloc[[0,1]] = 100
SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a
DataFrame
See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  self._setitem_with_indexer(indexer, value)


并且分配无法修改X。 ek!

In [281]: X
Out[281]:
   var1  var2  var3
0     3   NaN    11
4     3     9    13
3     2   NaN    14
2     5     9    12
1     2     7    13




要变通解决此问题,当您希望分配影响X时,您必须
分配给单个索引器(例如X.iloc = ...X.loc = ...X.ix = ...)-即没有链接索引。

在这种情况下,您可以使用

In [265]: X.iloc[[0,1], X.columns.get_indexer_for(['var2', 'var3'])] = 100

In [266]: X
Out[266]:
   var1  var2  var3
0     3   100   100
4     3   100   100
3     2   NaN    14
2     5     9    12
1     2     7    13


但我想知道是否有更好的方法,因为这不是很漂亮。

关于python - 在Python中使用ix子集DataFrame,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28566769/

10-11 07:21