基于分层行索引中的值创建列

2024-09-28 22:42:36 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个带有分层行索引的数据帧

def stack_example():
    i = pd.DatetimeIndex([ '2011-04-04',
                          '2011-04-06',
                          '2011-04-12', '2011-04-13'])
    cols = pd.MultiIndex.from_product([['milk', 'honey'],[u'jan', u'feb'], [u'PRICE','LITERS']])
    df = pd.DataFrame(np.random.randint(12, size=(len(i), 8)), index=i, columns=cols)

    df.columns.names = ['food', 'month', 'measure']
    df.index.names = ['when']

    df = df.stack('food', 'columns')
    df= df.stack('month', 'columns')

    df['constant_col'] = "foo"
    df['liters_related_col'] = df['LITERS']*99


    return df

我可以根据常量或涉及其他列的计算向这个数据帧添加新列。你知道吗

我想添加新的列,部分基于涉及索引的计算。你知道吗

例如,只需重复两次食物名称:

df.index
MultiIndex(levels=[[2011-04-04 00:00:00, 2011-04-06 00:00:00, 2011-04-12 00:00:00, 2011-04-13 00:00:00], [u'honey', u'milk'], [u'feb', u'jan']],
           labels=[[0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3], [0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 1, 1], [0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1]],
           names=[u'when', u'food', u'month'])
df.index.values[4][1]*2
'honeyhoney'

但我搞不懂创建这样的东西的语法:

df['xcol'] = df.index.values[2]*2

    Traceback (most recent call last):
      File "<input>", line 1, in <module>
      File "C:\Users\mds\Anaconda2\envs\bbg27\lib\site-packages\pandas\core\frame.py", line 2519, in __setitem__
        self._set_item(key, value)
      File "C:\Users\mds\Anaconda2\envs\bbg27\lib\site-packages\pandas\core\frame.py", line 2585, in _set_item
        value = self._sanitize_column(key, value)
      File "C:\Users\mds\Anaconda2\envs\bbg27\lib\site-packages\pandas\core\frame.py", line 2760, in _sanitize_column
        value = _sanitize_index(value, self.index, copy=False)
      File "C:\Users\mds\Anaconda2\envs\bbg27\lib\site-packages\pandas\core\series.py", line 3080, in _sanitize_index
        raise ValueError('Length of values does not match length of ' 'index')
    ValueError: Length of values does not match length of index

我也尝试过类似df['xcol'] = df.index.values[:][2]*2的变体


Tags: columnsindfindexvalueliblinesite
1条回答
网友
1楼 · 发布于 2024-09-28 22:42:36

df.index.values[4][1] * 2的情况下,值是一个字符串(honeyhoney),可以将其指定给列:

df['col1'] = df.index.values[4][1] * 2

df.col1

when        food   month
2011-04-04  honey  feb      honeyhoney
                   jan      honeyhoney
            milk   feb      honeyhoney
                   jan      honeyhoney

不过,在第二个示例中,即出现错误的示例中,您实际上并没有对单个值执行操作:

df.index.values[2]*2

(Timestamp('2011-04-04 00:00:00'),
 'milk',
 'feb',
 Timestamp('2011-04-04 00:00:00'),
 'milk',
 'feb')

根据您的需要,仍可以将所有内容压缩为字符串或其他格式:

df['col2'] = ''.join([str(x) for x in df.index.values[2]*2])

但是主要的问题是df.index.values[2]*2的输出提供了一个多维结构,它没有映射到df的现有结构。你知道吗

df中的新列可以是单个值(在这种情况下,它会自动复制以适应df中的行数),也可以具有与len(df)相同的条目数。你知道吗

更新
根据评论

IIUC,您可以使用get_level_values()将操作应用于MultiIndex的整个级别:

df.index.get_level_values(1).values*2

array(['honeyhoney', 'honeyhoney', 'milkmilk', 'milkmilk', 'honeyhoney',
       'honeyhoney', 'milkmilk', 'milkmilk', 'honeyhoney', 'honeyhoney',
       'milkmilk', 'milkmilk', 'honeyhoney', 'honeyhoney', 'milkmilk',
       'milkmilk'], dtype=object)

相关问题 更多 >