Để chọn ith
hàng, sử dụngiloc
:
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
Để chọn giá trị thứ i trong Btime
cột bạn có thể sử dụng:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
Có một sự khác biệt giữa df_test['Btime'].iloc[0]
(được khuyến nghị) và df_test.iloc[0]['Btime']
:
DataFrames lưu trữ dữ liệu trong các khối dựa trên cột (trong đó mỗi khối có một dtype duy nhất). Nếu bạn chọn theo cột trước, một khung nhìn có thể được trả về (nhanh hơn trả về một bản sao) và dtype ban đầu được giữ nguyên. Ngược lại, nếu bạn chọn theo hàng trước và nếu DataFrame có các cột của các loại khác nhau, thì Pandas sao chép dữ liệu vào một chuỗi kiểu đối tượng mới. Vì vậy, chọn cột nhanh hơn một chút so với chọn hàng. Vì vậy, mặc dù
df_test.iloc[0]['Btime']
hoạt động, df_test['Btime'].iloc[0]
là một chút hiệu quả hơn.
Có một sự khác biệt lớn giữa hai khi phân công.
df_test['Btime'].iloc[0] = x
ảnh hưởng df_test
, nhưng df_test.iloc[0]['Btime']
có thể không. Xem dưới đây để giải thích lý do tại sao. Bởi vì một sự khác biệt tinh tế trong thứ tự lập chỉ mục tạo ra sự khác biệt lớn trong hành vi, tốt hơn là sử dụng phân công lập chỉ mục duy nhất:
df.iloc[0, df.columns.get_loc('Btime')] = x
df.iloc[0, df.columns.get_loc('Btime')] = x
(khuyên dùng):
Cách được đề xuất để gán các giá trị mới cho DataFrame là tránh lập chỉ mục chuỗi và thay vào đó sử dụng phương thức được hiển thị bởi andrew ,
df.loc[df.index[n], 'Btime'] = x
hoặc là
df.iloc[n, df.columns.get_loc('Btime')] = x
Phương thức sau nhanh hơn một chút, vì df.loc
phải chuyển đổi nhãn hàng và cột thành chỉ mục vị trí, do đó, cần ít chuyển đổi hơn nếu bạn sử dụng
df.iloc
thay thế.
df['Btime'].iloc[0] = x
hoạt động, nhưng không được khuyến khích:
Mặc dù điều này hoạt động, nhưng nó đang tận dụng cách thức DataFrames hiện đang được triển khai. Không có gì đảm bảo rằng Pandas phải làm việc theo cách này trong tương lai. Cụ thể, nó đang lợi dụng thực tế là (hiện tại) df['Btime']
luôn trả về một chế độ xem (không phải là bản sao) để df['Btime'].iloc[n] = x
có thể được sử dụng để gán giá trị mới tại vị trí thứ n của Btime
cột df
.
Vì Pandas không đảm bảo rõ ràng về việc khi nào người lập chỉ mục trả về chế độ xem so với bản sao, các bài tập sử dụng lập chỉ mục chuỗi thường luôn tăng SettingWithCopyWarning
ngay cả trong trường hợp này, bài tập thành công trong việc sửa đổi 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
không hoạt động:
Ngược lại, gán với df.iloc[0]['bar'] = 123
không hoạt động vì df.iloc[0]
đang trả lại một bản sao:
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
Cảnh báo : Tôi đã đề nghị trước đây df_test.ix[i, 'Btime']
. Nhưng điều này không được đảm bảo để cung cấp cho bạn ith
giá trị vì ix
cố gắng lập chỉ mục theo nhãn trước khi cố gắng lập chỉ mục theo vị trí . Vì vậy, nếu DataFrame có một chỉ số nguyên không theo thứ tự được sắp xếp bắt đầu từ 0, thì việc sử dụng ix[i]
sẽ trả về hàng được gắn nhãn i
thay vì ith
hàng. Ví dụ,
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'
df_test.head(1)
sẽ hoạt động, hình thức tổng quát hơn là sử dụngiloc
như được trả lời bởi unutbu