我有一个带有分层行索引的数据帧
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
的变体
在
df.index.values[4][1] * 2
的情况下,值是一个字符串(honeyhoney
),可以将其指定给列:不过,在第二个示例中,即出现错误的示例中,您实际上并没有对单个值执行操作:
根据您的需要,仍可以将所有内容压缩为字符串或其他格式:
但是主要的问题是
df.index.values[2]*2
的输出提供了一个多维结构,它没有映射到df
的现有结构。你知道吗df
中的新列可以是单个值(在这种情况下,它会自动复制以适应df
中的行数),也可以具有与len(df)
相同的条目数。你知道吗更新
根据评论
IIUC,您可以使用
get_level_values()
将操作应用于MultiIndex
的整个级别:相关问题 更多 >
编程相关推荐