Я создал ряд очень простых функций, которые я хочу применить к пандам DataFrame.Например:
def dir_flag(start, end):
try:
if start < end:
return '+'
else:
return '-'
except:
return 'NA'
Я импортировал CSV-файл в DataFrame с именем «mydata» и могу применить мою функцию:
mydata['direction'] = mydata.apply(lambda x: dir_flag(x['START_NODE'], x['END_NODE']), axis=1)
Это прекрасно работает.Однако, когда я пытаюсь применить эту функцию - или аналогичные функции к Pandas DataFrame, созданному как подмножество «mydata», я получаю следующую ошибку: ValueError: Wrong number of items passed 2, placement implies 0
.К вашему сведению mydata
содержит 3-уровневый мультииндекс.
Подмножество происходит в следующем цикле:
idx = pd.IndexSlice
idx1_levels = mydata.index.unique(level='idx_level1').tolist()
for x in idx1_levels:
idx1_subset = mydata.loc[idx[x], ['START_NODE','END_NODE']]
idx2_levels = idx1_subset.index.unique(level='idx_level2').tolist()
for y in idx2_levels:
idx2_subset = idx1_subset.loc[idx[y]]
idx3_subset = idx2_subset.loc[idx[slice(None), 1.0], ['START_NODE','END_NODE']]
idx3_subset['direction'] = journey_offset.apply(lambda a: dir_flag(a['START_NODE'], a['END_NODE']), axis=1)
Это оператор idx3_subset = idx2_subset.loc[idx[slice(None), 1.0], ['START_NODE','END_NODE']]
, который, кажется, вызывает проблему, как я могус радостью примените мою функцию к idx2_subset
Обратите внимание, что я очень плохо знаком с Python, и я сильно подозреваю, что есть лучший способ подмножества моего исходного DataFrame (например, с использованием метода groupby).Я очень рад получить предложения о том, как можно улучшить общее подмножество, но, пожалуйста, любой ответ может ответить на конкретный вопрос, почему это не работает, так как это поможет мне лучше понять, как работают Pandas DataFrames.
Упрощенная версия чтения в формате csv:
idx_level1|idx_level2|idx_level3|idx_level4|START_NODE|END_NODE
353386066294006|1142|2018-09-20T07:57:26Z|1|18260004567689|18260005575180
353386066294006|1142|2018-09-20T07:57:26Z|2|18260004567689|18260004240718
353386066294006|1142|2018-09-20T07:57:26Z|3|18260005359901|18260004567689
353386066294006|1142|2018-09-20T07:57:31Z|1|18260004567689|18260005575180
353386066294006|1142|2018-09-20T07:57:31Z|2|18260004567689|18260004240718
353386066294006|1142|2018-09-20T07:57:31Z|3|18260005359901|18260004567689
353386066294006|1142|2018-09-20T07:57:36Z|1|18260004567689|18260005575180
353386066294006|1142|2018-09-20T07:57:36Z|2|18260004567689|18260004240718
353386066294006|1142|2018-09-20T07:57:36Z|3|18260005359901|18260004567689
353386066736543|22|2018-04-17T07:08:23Z|||
353386066736543|22|2018-04-17T07:08:24Z|||
353386066736543|22|2018-04-17T07:08:25Z|||
353386066736543|22|2018-04-17T07:08:26Z|||
353386066736543|403|2018-07-02T16:55:07Z|1|18260004580350|18260005235340
353386066736543|403|2018-07-02T16:55:07Z|2|18260005235340|18260005141535
353386066736543|403|2018-07-02T16:55:07Z|3|18260005235340|18260005945439
353386066736543|403|2018-07-02T16:55:07Z|4|18260006215338|18260005235340
353386066736543|403|2018-07-02T16:55:07Z|5|18260004483352|18260005945439
353386066736543|403|2018-07-02T16:55:07Z|6|18260004283163|18260006215338
353386066736543|403|2018-07-02T16:55:01Z|1|18260004580350|18260005235340
353386066736543|403|2018-07-02T16:55:01Z|2|18260005235340|18260005141535
353386066736543|403|2018-07-02T16:55:01Z|3|18260005235340|18260005945439
353386066736543|403|2018-07-02T16:55:01Z|4|18260006215338|18260005235340
353386066736543|403|2018-07-02T16:55:01Z|5|18260004483352|18260005945439
353386066736543|403|2018-07-02T16:55:01Z|6|18260004283163|18260006215338
И код, который я использую для чтения, выглядит следующим образом:
mydata = pd.read_csv('/myloc/my_simple_data.txt', sep='|',
dtype={'idx_level1': 'int',
'idx_level2': 'int',
'idx_level3': 'str',
'idx_level4': 'float',
'START_NODE': 'str',
'END_NODE': 'str'},
parse_dates = ['idx_level3'],
index_col=['idx_level1','idx_level2','idx_level3','idx_level4'])
Интересно, что при составлении этого набора данных - я понялчто ошибка возникает только тогда, когда у меня есть данные с нулевыми значениями - NB это включает нулевые значения на одном уровне индекса.Индекс здесь на самом деле нулевой, т. Е. Это НЕ ошибка в данных.