In [1]: dates = pd.date_range('1/1/2000', periods=8)
In [2]: df = pd.DataFrame(np.random.randn(8, 4), index=dates, columns=['A', 'B', 'C', 'D'])
In [3]: s = df['A']
2.10 Fast scalar value getting and setting
Since indexing with []
must handle a lot of cases (single-label access,
slicing, boolean indexing, etc.), it has a bit of overhead in order to figure
out what you’re asking for. If you only want to access a scalar value, the
fastest way is to use the at
and iat
methods, which are implemented on
all of the data structures.
Similarly to loc
, at
provides label based scalar lookups, while, iat
provides integer based lookups analogously to iloc
In [4]: s
Out[4]:
2000-01-01 0.4691
2000-01-02 1.2121
2000-01-03 -0.8618
2000-01-04 0.7216
2000-01-05 -0.4250
2000-01-06 -0.6737
2000-01-07 0.4047
2000-01-08 -0.3706
Freq: D, Name: A, dtype: float64
In [5]: s.iat[5]
Out[5]: -0.67368970808837059
In [6]: df
Out[6]:
A B C D
2000-01-01 0.4691 -0.2829 -1.5091 -1.1356
2000-01-02 1.2121 -0.1732 0.1192 -1.0442
2000-01-03 -0.8618 -2.1046 -0.4949 1.0718
2000-01-04 0.7216 -0.7068 -1.0396 0.2719
2000-01-05 -0.4250 0.5670 0.2762 -1.0874
2000-01-06 -0.6737 0.1136 -1.4784 0.5250
2000-01-07 0.4047 0.5770 -1.7150 -1.0393
2000-01-08 -0.3706 -1.1579 -1.3443 0.8449
In [7]: dates
Out[7]:
DatetimeIndex(['2000-01-01', '2000-01-02', '2000-01-03', '2000-01-04',
'2000-01-05', '2000-01-06', '2000-01-07', '2000-01-08'],
dtype='datetime64[ns]', freq='D')
In [8]: df.at[dates[5], 'A']
Out[8]: -0.67368970808837059
In [9]: df.iat[3, 0]
Out[9]: 0.72155516224436689
You can also set using these same indexers.
In [10]: df
Out[10]:
A B C D
2000-01-01 0.4691 -0.2829 -1.5091 -1.1356
2000-01-02 1.2121 -0.1732 0.1192 -1.0442
2000-01-03 -0.8618 -2.1046 -0.4949 1.0718
2000-01-04 0.7216 -0.7068 -1.0396 0.2719
2000-01-05 -0.4250 0.5670 0.2762 -1.0874
2000-01-06 -0.6737 0.1136 -1.4784 0.5250
2000-01-07 0.4047 0.5770 -1.7150 -1.0393
2000-01-08 -0.3706 -1.1579 -1.3443 0.8449
In [11]: df.at[dates[5], 'E'] = 7
In [12]: df.iat[3, 0] = 7
at
may enlarge the object in-place as above if the indexer is missing.
In [13]: df
Out[13]:
A B C D E
2000-01-01 0.4691 -0.2829 -1.5091 -1.1356 NaN
2000-01-02 1.2121 -0.1732 0.1192 -1.0442 NaN
2000-01-03 -0.8618 -2.1046 -0.4949 1.0718 NaN
2000-01-04 7.0000 -0.7068 -1.0396 0.2719 NaN
2000-01-05 -0.4250 0.5670 0.2762 -1.0874 NaN
2000-01-06 -0.6737 0.1136 -1.4784 0.5250 7.0
2000-01-07 0.4047 0.5770 -1.7150 -1.0393 NaN
2000-01-08 -0.3706 -1.1579 -1.3443 0.8449 NaN
In [14]: df.at[dates[-1]+1, 0] = 7
In [15]: df
Out[15]:
A B C D E 0
2000-01-01 0.4691 -0.2829 -1.5091 -1.1356 NaN NaN
2000-01-02 1.2121 -0.1732 0.1192 -1.0442 NaN NaN
2000-01-03 -0.8618 -2.1046 -0.4949 1.0718 NaN NaN
2000-01-04 7.0000 -0.7068 -1.0396 0.2719 NaN NaN
... ... ... ... ... ... ...
2000-01-06 -0.6737 0.1136 -1.4784 0.5250 7.0 NaN
2000-01-07 0.4047 0.5770 -1.7150 -1.0393 NaN NaN
2000-01-08 -0.3706 -1.1579 -1.3443 0.8449 NaN NaN
2000-01-09 NaN NaN NaN NaN NaN 7.0
[9 rows x 6 columns]