iloc генерирует ошибку при переборе кадров данных из словаря - PullRequest
0 голосов
/ 10 июня 2018

Я загрузил свои текстовые файлы из папки в виде Dataframes в словарь с именем файла в качестве ключа.Если я запускаю цикл по своим элементам в словаре, чтобы выполнить определенные операции индивидуально с моими кадрами данных, то функции iloc работают для первой операции, а затем генерируют единственную ошибку индекса позиции.

 i = 0
 dict = {}
 for root, dirs, files in os.walk(root):
 for file in os.listdir(root):
    if file.endswith(".tlm-raw"):
        name = os.path.splitext(file)[0]
        dict[name] = pd.read_table(os.path.join(root,file),index_col=False,header=None, skiprows=53,engine='python')   

Затем я запускаю цикл по своему словарю и, скажем, хочу получить 13-й столбец из каждого моего фрейма данных.Первый раз, когда я вызываю мой dataframe и slice, используя Iloc, это работает.

for k in dict:
    df=pd.DataFrame.from_dict(dict[k])
    X=df.iloc[:,12]
    print(X)

До этого все работает.Но если я еще захочу нарезать столбец из него.Давайте я хочу 19-й столбец.Это поднимает следующую ошибку.

    y=df.iloc[:,18]
    **IndexError: single positional indexer is out-of-bounds**

Мой искренний запрос.На самом деле я хочу загрузить файлы из папки, сохранить их в виде фреймов данных в словаре, затем выполнить итерацию по каждому из фреймов данных, выполнить определенные операции и сохранить измененные фреймы данных в новом словаре.Каков наиболее реальный способ сделать это?

1 Ответ

0 голосов
/ 10 июня 2018

Я думаю, вам нужно сначала изменить dict на d, потому что dict - это python kyeword:

 i = 0
 d = {}
 for root, dirs, files in os.walk(root):
 for file in os.listdir(root):
    if file.endswith(".tlm-raw"):
        name = os.path.splitext(file)[0]
        d[name] = pd.read_table(os.path.join(root,file),index_col=False,header=None, skiprows=53,engine='python')   

Так что d - это dictionary of DataFrame s, поэтому индексация возможна с помощью:

d['file_name'].iloc[:, 9]

РЕДАКТИРОВАТЬ:

d1 = {}
for k, v in d.items()
  #modify v

  df1[k] = v

Мое редактирование: Здесь я предполагаю, что у нас есть несколько фреймов данных в словаре d, я перебираю каждый из них по ключу (что в моем случаеэто имя файла).Выполняя операции по каждому из них.Давайте предположим, что мы пытаемся разделить столбцы между 31-м и 94-м столбцами.

d1={}
for k in d:
  df=pd.DataFrame.from_dict(d[k])
  Result=pd.DataFrame(df.iloc[:,30:93])
  d1[k]=pd.DataFrame(Result)

Таким образом, вы изменили словарь с теми же ключами.

Мне нужно:

d1={}
for k, v in d.items():
  d1[k] = v.iloc[:,30:93]

Или:

d1 = {k: v.iloc[:,30:93] for k, v in d.items()}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...