В Python добавление пустого списка в столбец dataframe с помощью лямбды повышает valueError

1

Я смог воспроизвести ошибку на синтетических данных:

import pandas as pd
from datetime import datetime

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': [datetime.now(), datetime.now(), datetime.now(), datetime.now()],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3]);
df2 = pd.DataFrame({'A': ['A1', 'A2', 'A3', 'A4'],
                    'E': ['E1', 'E2', 'E3', 'E4']},
                   index=[0,1,2,3]);

df = pd.merge(df1, df2, how='left', on=['A', 'A']);

def getList(row):
    r = [];
    if row["A"] == "A1": r.append("test-01");
    if row["B"] == "B1": r.append("test-02");
    if row["B"] == "B2": r.append("test-03");
    return r;

df["NEW_COLUMN"] = df.apply(lambda row: getList(row), axis = 1);

Оригинальное сообщение: я хотел бы создать новый столбец в dataframe pandas на основе нескольких условий. Значение нового столбца должно быть списком. Однако я получил "ValueError: пустые данные, прошедшие с указанными индексами". в случае пустого списка.

def getList(p_row):
  r = [];
  if p_row["field1"] > 0: r.append("x");
  ...
  return r;

df["new_list_field"] = df.apply(lambda row: getList(row), axis = 1);

Полная ошибка:

ValueError Traceback (последний последний вызов) C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py в create_block_manager_from_arrays (массивы, имена, оси) 4636 try: → 4637 blocks = form_blocks (массивы, имена, оси) 4638 mgr = BlockManager (блоки, оси)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py в form_blocks (массивы, имена, оси) 4728, если len (object_items)> 0: → 4729 object_blocks = _simple_blockify (object_items, np.object_) ) 4730 blocks.extend(object_blocks)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py в _simple_blockify (кортежи, dtype) 4758 "" "-> 4759 значений, размещение = _stack_arrays (кортежи, dtype) 4760

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py в _stack_arrays (кортежи, dtype) 4822 для i, arr перечислять (массивы): → 4823 stacked [i] = _asarray_compat (arr) 4824

ValueError: не может передавать входной массив из формы (2) в форму (195)

Во время обработки вышеуказанного исключения произошло другое исключение:

ValueError Traceback (последний последний вызов) в() → 1 df ["new_list_field"] = df.apply (лямбда-строка: getList (строка), ось = 1);

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py в приложении (self, func, axis, broadcast, raw, reduce, args, ** kwds) 4875 f, axis, 4876 уменьшить = уменьшить, → 4877 ignore_failures = ignore_failures) 4878: 4879 return self._apply_broadcast (f, axis)

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py в _apply_standard (self, func, axis, ignore_failures, reduce) 4988 index = None 4989 → 4990 result = self._constructor (data = results, index = index) 4991 result.columns = res_index 4992

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py в init (self, data, index, columns, dtype, copy) 328 dtype = dtype, copy = copy) 329 elif isinstance (данные, dict): → 330 mgr = self._init_dict (данные, индекс, столбцы, dtype = dtype) 331 elif isinstance (данные, ma.MaskedArray): 332 import numpy.ma.mrecords as mrecords

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py в _init_dict (self, data, index, columns, dtype) 459 arrays = [данные [k] для k в ключах] 460 → 461 return _arrays_to_mgr (массивы, data_names, index, columns, dtype = dtype) 462 463 def _init_ndarray (self, values, index, columns, dtype = None, copy = False):

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\frame.py в _arrays_to_mgr (массивы, arr_names, index, columns, dtype) 6171 axes = [_ensure_index (columns), _ensure_index (index)] 6172 → 6173 return create_block_manager_from_arrays (массивы, arr_names, топоры) 6174 6175

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py в create_block_manager_from_arrays (массивы, имена, оси) 4640
return mgr 4641 за исключением ValueError как e: → 4642 construct_error (len (массивы), массивы [0].shape, axes, e) 4643 4644

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\internals.py в build_error (tot_items, block_shape, axes, e) 4604
raise e 4605 if block_shape [0] == 0: → 4606 повысить значение ValueError ("Пустые данные, переданные с указанными индексами").

4607 raise ValueError ("Форма переданных значений - {0}, индексы подразумевают {1}". Формат (4608 передано, подразумевается))

ValueError: пустые данные передаются с указанными индексами.

  • 0
    Добро пожаловать на SO !, вы можете предоставить dataframe в минимальном, Полных и проверяемых образом.
  • 0
    К сожалению, не могу поделиться исходными данными. Это набор данных из миллиона записей, объединенный из нескольких источников данных, и содержит очень конфиденциальную информацию. Имея указатель на 2 столбца. К сожалению, не может воспроизвести его с примерами данных, потому что этот код работает правильно. Также попытался создать копию среза большого набора данных, но получил то же сообщение об ошибке.
Показать ещё 2 комментария
Теги:
pandas

2 ответа

1

Длина вывода этой функции варьируется от строки к строке, но вы не можете назначать списки неравных длин новому столбцу pandas. Вы можете проверить это через:

for idx,row in df.iterrows():
    print(getList(row))

Альтернативой было бы преобразование вывода в строку вместо:

def getListString(row):
    r = ''
    if row["A"] == "A1": r+="test-01"
    if row["B"] == "B1": r+="test-02"
    if row["B"] == "B2": r+="test-03"
    return r
  • 1
    df ["C"] = df ['C']. dt.date устранил проблему. Понятия не имею почему :-(
0

в итоге мы создали список списков, превратили его в pd.Series() и присвоили его новому столбцу. словарь key2list возвращает списки переменной длины в качестве значений:

new_col_list = []

for _, row in my_df.iterrows():
    new_col_list.append(key2list[row[u'key']])

my_df[u'new_col'] = pd.Series(new_col_list)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню