Как получить доступ к определенным значениям в фрейме данных на основе значений индекса, используя loc [i, j]

#python #pandas #for-loop #indexing

#python #pandas #для цикла #индексирование

Вопрос:

У меня есть данные в текстовом файле, я преобразовал их в фрейм данных (data3), я переименовал индекс в running от -6 до 5, и теперь, в цикле for, я хочу получить доступ к определенным значениям фрейма данных с помощью команды iloc, но я не получаю правильные значения.

Фрейм данных выглядит следующим образом

если я использую data3.iloc[-6,1] Я ожидал возвращаемое значение = -6, но вместо этого я получаю -20

data3.iloc[-5,1] Я ожидал = -20, но вместо этого я получил -6

data3.iloc[-4,1] Я ожидал = -28, но вместо этого я получил -7

Может кто-нибудь мне помочь, пожалуйста? Для меня важно сохранить индекс от -6 до 5 Вот мой код. Спасибо

 import numpy as np
import pandas as pd


data= pd.read_csv('perfilprueba.txt',delimiter=' ')

## This is because when I read the txt doesnt read dist and amp as diferent 
columns
data_drop = data.drop(data.columns[[1, 2, 3, 4, 6,7]], axis=1) 
data2=data_drop.rename(columns={"Unnamed: 5": "amp"})

## These are two index I will use later
m=int(round(len(data2.index)))
n=int(round(m/2))

## This is because I wanted that my data had index values from -6 to 5  AND
## also a column with values from -6 to  5

r = pd.Series(np.linspace(-n, n-1,m))  
data2['r'] = r 
erre = pd.Series(np.linspace(-n, n-1,m))  
data2['erre']=erre 
data3=data2.set_index('r')

## Now I want to run a for loop
## that returns me the values of the "amp" column as r moves from -6 to  5

ap=[]
for r in range(-n,n):
     a = data3.loc[[r],['amp']]
     ap    = [a]
  

Ответ №1:

pandas.DataFrame.iloc это «индексация на основе чистого целочисленного местоположения для выбора по позиции» (из документа), что означает, что при вызове вы data3.iloc[-5, 1] фактически извлекаете данные из второго столбца 5-й строки с конца вашего фрейма данных.

В вашем случае я бы использовал pandas.DataFrame.at (документ здесь), хотя в этом случае вы также можете использовать pandas.DataFrame.loc .

Сценарий будет выглядеть так:

 # reading the data (the "sep=s " parameter does what is needed)
data3 = pd.read_csv('perfilprueba.txt', sep="s ")

m = int(round(len(data3.index)))
n = int(round(m/2))

# changing the index so it starts at -n
data3.index -= n
data3['erre'] = data3.index

ap = []
for r in range(-n,n):
    # note that you have to use the column name here
    a = data3.at[r,"amp"]
    ap.append(a)
  

Ответ №2:

Доступ к одному значению для пары строк / столбцов по целочисленной позиции.
Документация ap=[] для r в диапазоне (-n,n): a = data3.loc[r].iat 1 ap = [a]