Это кажется нелепо простым вопросом ... но я не вижу простого ответа, которого ожидал.
Итак, как мне получить значение в n-й строке данного столбца в Pandas? (Я особенно заинтересован в первом ряду, но также был бы заинтересован в более общей практике).
Например, скажем, я хочу получить значение 1.2 в Btime в качестве переменной.
Какой правильный способ сделать это?
df_test =
ATime X Y Z Btime C D E
0 1.2 2 15 2 1.2 12 25 12
1 1.4 3 12 1 1.3 13 22 11
2 1.5 1 10 6 1.4 11 20 16
3 1.6 2 9 10 1.7 12 29 12
4 1.9 1 1 9 1.9 11 21 19
5 2.0 0 0 0 2.0 8 10 11
6 2.4 0 0 0 2.4 10 12 15
df_test.head(1)
работал, то более общая форма - использовать,iloc
как отвечает unutbu1.2
? или Ряд длины 1, который вы получитеdf_test.head(1)
, который также будет содержать индекс? Чтобы получить только значение сделатьdf_test.head(1).item()
, илиtolist()
затем нарезать.Ответы:
Чтобы выбрать
ith
строку, используйтеiloc
:Чтобы выбрать i-е значение в
Btime
столбце, вы можете использовать:Существует разница между
df_test['Btime'].iloc[0]
(рекомендуется) иdf_test.iloc[0]['Btime']
:Фреймы данных хранят данные в блоках на основе столбцов (где каждый блок имеет один тип d). Если сначала выбрать по столбцу, представление может быть возвращено (что быстрее, чем вернуть копию), и исходный тип d будет сохранен. Напротив, если вы выбираете сначала по строке и если DataFrame имеет столбцы с разными dtypes, то Pandas копирует данные в новую серию объектов dtype. Таким образом, выбор столбцов немного быстрее, чем выбор строк. Таким образом, хотя
df_test.iloc[0]['Btime']
работает,df_test['Btime'].iloc[0]
это немного более эффективно.Существует большая разница между ними, когда дело доходит до назначения.
df_test['Btime'].iloc[0] = x
влияетdf_test
, ноdf_test.iloc[0]['Btime']
не может. Смотрите ниже для объяснения почему. Поскольку незначительная разница в порядке индексации имеет большое значение в поведении, лучше использовать одно назначение индексации:df.iloc[0, df.columns.get_loc('Btime')] = x
(рекомендуемые):Рекомендуемый способ для присвоения новых значений к DataFrame, чтобы избежать прикован индексации , и вместо этого использовать метод , показанный на Первозванного ,
или
Последний метод немного быстрее, потому что
df.loc
он должен конвертировать метки строк и столбцов в позиционные индексы, поэтому при использованииdf.iloc
вместо этого требуется чуть меньше преобразования .df['Btime'].iloc[0] = x
работает, но не рекомендуется:Несмотря на то, что это работает, то , воспользовавшись способом DataFrames являются в настоящее время реализованы. Нет никаких гарантий, что Панды должны работать таким образом в будущем. В частности, он использует тот факт, что (в настоящее время)
df['Btime']
всегда возвращает представление (а не копию), поэтомуdf['Btime'].iloc[n] = x
его можно использовать для назначения нового значения в n-м местеBtime
столбцаdf
.Поскольку Pandas не дает явных гарантий относительно того, когда индексаторы возвращают представление вместо копии, присваивания, которые используют цепную индексацию, обычно всегда повышают значение,
SettingWithCopyWarning
даже если в этом случае присваивание успешно изменяетсяdf
:df.iloc[0]['Btime'] = x
не работает:Напротив, назначение с
df.iloc[0]['bar'] = 123
не работает, потому чтоdf.iloc[0]
возвращает копию:Предупреждение : я ранее предлагал
df_test.ix[i, 'Btime']
. Но это не гарантирует, что вы получитеith
значение, поскольку пытаетесьix
проиндексировать по метке, прежде чем пытаться проиндексировать по позиции . Таким образом, если DataFrame имеет целочисленный индекс, который находится не в отсортированном порядке, начиная с 0, тогда при использованииix[i]
будет возвращена строка с меткой,i
а неith
строка. Например,источник
df_test.iloc[0]['Btime']
работает,df_test.iloc['Btime'][0]
это немного более эффективно.df['Btime'].iloc[0]
предпочтительнееdf['Btime'].values[0]
? из документации видно, что в ней написано «Предупреждение: мы рекомендуем использовать Series.array или Series.to_numpy (), в зависимости от того, нужна ли вам ссылка на базовые данные или массив NumPy». но я не знаю точно , что это значитОбратите внимание, что ответ от @unutbu будет правильным, пока вы не захотите установить значение на что-то новое, тогда он не будет работать, если ваш фрейм данных является представлением.
Другой подход, который будет последовательно работать как с установкой, так и с получением:
источник
Еще один способ сделать это:
Этот способ кажется более быстрым, чем использование
.iloc
:источник
df.iloc[0].head(1)
- Первый набор данных только из всего первого ряда.df.iloc[0]
- Весь первый ряд в столбце.источник
В общем случае, если вы хотите , чтобы забрать первые N строки из столбца J из
pandas dataframe
лучшего способа сделать это:источник
Например, чтобы получить значение из столбца 'test' и строки 1, оно работает следующим образом
как только
df[['test']].values[0]
возвращает массивисточник
Еще один способ получить первую строку и сохранить индекс:
источник