python函数在循环中子集时不适用于熊猫数据框



我创建了许多非常简单的功能,我想应用于pandas dataframe。例如:

def dir_flag(start, end):
   try:
      if start < end:
         return '+'
      else:
         return '-'
   except:
      return 'NA'

我已经将CSV文件导入到一个名为" mydata"的数据框架中,并且可以应用我的功能:

mydata['direction'] = mydata.apply(lambda x: dir_flag(x['START_NODE'], x['END_NODE']), axis=1)

这很好。但是,当我尝试将此功能应用于" 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的新手,我强烈怀疑有一种更好的方法来子集我的原始数据框架(例如,例如使用Groupby方法)。我很高兴收到有关如何改善整体子集的建议 - 但是请任何答案都解决了为什么这不起作用的具体问题,因为这将有助于提高我对Pandas DataFrames如何工作的理解。

读取CSV的简化版本IS:

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'])

有趣的是,在整理此数据集的同时 - 我意识到该错误仅在我的数据中有nulls -nb -nb中发生,这包括索引的一个级别。这里的索引是合法的,即这不是数据中的错误。

,因此问题源于在多索引上进行索引切片,其中一个级别包含空。因此,解决方案是用常数替换为零值:

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)

虽然这确实回答了这个问题,但就理解是什么特别导致错误并提供了一种避免这种错误的方法 - 我仍然不知所措,为什么nulls首先引起问题。

<</p>

最新更新