Я смог воспроизвести ошибку на синтетических данных:
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 4644C:\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: пустые данные передаются с указанными индексами.
Длина вывода этой функции варьируется от строки к строке, но вы не можете назначать списки неравных длин новому столбцу 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
в итоге мы создали список списков, превратили его в 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)
dataframe
в минимальном, Полных и проверяемых образом.