Функция Python, не работающая с Pandas Dataframe, когда она находится в цикле - PullRequest
0 голосов
/ 17 декабря 2018

Я создал ряд очень простых функций, которые я хочу применить к пандам 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 это включает нулевые значения на одном уровне индекса.Индекс здесь на самом деле нулевой, т. Е. Это НЕ ошибка в данных.

1 Ответ

0 голосов
/ 18 декабря 2018

Таким образом, проблема связана с созданием фрагмента индекса в мультииндексе, где один из уровней содержит нули.Поэтому решение состоит в том, чтобы заменить нулевое значение константой:

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 = ['time']);

mydata.idx_level4 = mydata.idx_level4.fillna(1.0)

mydata.set_index(['idx_level1','idx_level2','idx_level3','idx_level4'], inplace=True)

Хотя это действительно отвечает на вопрос, с точки зрения понимания того, что конкретно вызывает ошибку, и дать метод для ее устранения - я все еще впотеря в том, почему пустые значения вызывают проблемы в первую очередь.

...