Понимание списка с состоянием данных; ValueError: неправильная длина элемента - PullRequest
0 голосов
/ 30 марта 2020

Я пытаюсь использовать понимание списка для создания списка фреймов данных, в котором элемент, который я добавляю, является DataFrame[condition = True]. Однако я получаю сообщение об ошибке:

list_of_dataframes = [df0[(df0['Names'].values == my_list_of_names[i])] for i in range(len(my_list_of_names))]

Файл "/home/josep/anaconda3/lib/python3.7/site-packages/pandas/core/frame.py", строка 2986, в getitem вернуть self._getitem_bool_array (ключ)

Файл "/home/josep/anaconda3/lib/python3.7/site-packages /pandas/core/frame.py ", строка 3033, в _getitem_bool_array " Элемент неправильной длины% d вместо% d. " % (len (ключ), len (self.index))

ValueError: неправильная длина элемента 233 вместо 234.

Для понимание списка, синтаксис выглядит так:

new_list = []
for i in old_list:
    if filter(i):
        new_list.append(expressions(i))

Что переписано как: new_list = [expression(i) for i in old_list if filter(i)]

Итак, теперь мой for bucle:

my_list_of_names = pd.DataFrame('0': ['Jou', 'Lara'])
d = {'Names': ['John', 'Lara', 'Ari', 'Jou'], 'col2': [1, 2, 2, 2], 'col3': [1, 2 ,3, 4], 'col4': [2,1,1,1,], 'col5': [2,1,0,0], 'col6': [2,1,3,1]}
df0 = pd.DataFrame(data=d)

list_of_dataframes = []
for i in range(len(my_list_of_names)):
    df_i = df0[(df0['Names'].values ==
                  my_list_of_names.values[i])]
    list_of_dataframes.append(df_i)

Который может быть записан как:

list_of_dataframes = [df0[(df0['Names'].values == 
 my_list_of_names.values[i])] for i in range(len(my_list_of_names))]

И , это прекрасно работает . Но если я попытаюсь упростить мой код, изменив тип my_list_of_names, который является DataFrame, на список тип:

my_list_of_names2 = ['Jou', 'Lara']  # IS A LIST
list_of_df = [df0[(df0['Names'].values ==
                   my_list_of_names2[measure])
                  ] for measure in range(len(my_list_of_names2))]

Это вызовет ошибку значения:

runcell (7, '~ / sample.py') Traceback (последний последний вызов):

Файл "~ / sample.py", строка 263, для измерения в диапазоне (len (my_list_of_names2))]

Файл "~ / sample.py", строка 263, для измерения в диапазоне (len (my_list_of_names2))]]

Файл "~ home / josep / anaconda3 / lib / python3 .7 / site-packages / pandas / core / frame.py ", строка 2986, в getitem return self._getitem_bool_array (key)

File" / home / josep / anaconda3 / lib / python3 .7 / site-packages / pandas / core / frame.py ", строка 3033, в _getitem_bool_array" Элемент неверной длины% d вместо% d. " % (len (ключ), len (self.index))

ValueError: Элемент неправильной длины 233 вместо 234.

ПРИМЕЧАНИЕ. Реальный список и датафреймы разные, но ради вопроса я подумал, что проще поставить более короткие.

1 Ответ

1 голос
/ 30 марта 2020

Возможно, это не лучшее решение, но я считаю, что оно решает ваш прямой пример.

for name in my_list_of_names:
    df_i = df0[df0['Names'] == name]
    list_of_dataframes.append(df_i)
...