要选择第i行,使用iloc:
In [31]: df_test.iloc[0]
Out[31]:
ATime 1.2
X 2.0
Y 15.0
Z 2.0
Btime 1.2
C 12.0
D 25.0
E 12.0
Name: 0, dtype: float64
要在Btime列中选择第i个值,您可以使用:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
df_test['Btime']之间有区别。iloc[0](推荐)和df_test.iloc[0]['Btime']:
DataFrames store data in column-based blocks (where each block has a single
dtype). If you select by column first, a view can be returned (which is
quicker than returning a copy) and the original dtype is preserved. In contrast,
if you select by row first, and if the DataFrame has columns of different
dtypes, then Pandas copies the data into a new Series of object dtype. So
selecting columns is a bit faster than selecting rows. Thus, although
df_test.iloc[0]['Btime'] works, df_test['Btime'].iloc[0] is a little bit
more efficient.
当涉及到作业时,两者之间有很大的区别。
df_test [' Btime ']。iloc[0] = x影响df_test,但是df_test.iloc[0]['Btime']
可能不会。请看下面的解释。因为细微的差别
索引的顺序在行为上有很大的不同,最好使用单索引赋值:
df.iloc[0, df.columns.get_loc('Btime')] = x
df。iloc[0, df.columns.get_loc('Btime')] = x(推荐):
为对象赋新值的推荐方法
DataFrame是为了避免链式索引,而是使用所示的方法
安德鲁,
df.loc[df.index[n], 'Btime'] = x
or
df.iloc[n, df.columns.get_loc('Btime')] = x
后一种方法稍微快一点,因为df。Loc必须将行标签和列标签转换为
位置索引,所以如果你使用
df。iloc代替。
df(“Btime”)。Iloc [0] = x工作,但不建议:
虽然这是可行的,但它利用了目前实现dataframe的方式。没有人保证熊猫将来一定要这样工作。特别地,它利用了(当前)df['Btime']总是返回a
view(非副本)so df['Btime']。Iloc [n] = x可以用来赋一个新值
在df的Btime列的第n个位置。
由于Pandas没有明确保证索引器什么时候返回一个视图,什么时候返回一个副本,使用链式索引的赋值通常会引发一个SettingWithCopyWarning,即使在这种情况下赋值成功修改了df:
In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
In [26]: df
Out[26]:
foo bar
0 A 99 <-- assignment succeeded
2 B 100
1 C 100
df。iloc[0]['Btime'] = x不正常:
相反,df赋值。Iloc [0]['bar'] = 123不工作,因为df。Iloc[0]返回一个副本:
In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
In [67]: df
Out[67]:
foo bar
0 A 99 <-- assignment failed
2 B 100
1 C 100
警告:我之前建议使用df_test。第九(我,“Btime”)。但这并不能保证给你第i个值,因为ix在尝试按位置索引之前会先尝试按标签索引。因此,如果DataFrame有一个整数索引,它不是按从0开始的顺序排序的,那么使用ix[i]将返回标记为i的行,而不是第i行。例如,
In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [2]: df
Out[2]:
foo
0 A
2 B
1 C
In [4]: df.ix[1, 'foo']
Out[4]: 'C'