【发布时间】:2019-09-27 08:28:01
【问题描述】:
我正在尝试根据多个条件将新行添加到我的 MultiIndex 数据框中。
以下代码是我如何设置我想要操作的初始数据帧(不是真实的,但足以说明我遇到的问题......):
def mklbl(prefix, n):
return ["%s%s" % (prefix, i) for i in range(n)]
----
miindex = pd.MultiIndex.from_product([mklbl('A', 3),
mklbl('B', 4),
], names=['A','B'])
micolumns = pd.MultiIndex.from_tuples([('a', 'foo'), ('a', 'bar'),
('b', 'foo'), ('b', 'bah')],
names=['lvl0', 'lvl1'])
df = pd.DataFrame(np.random.randint(100, size=len(miindex) * len(micolumns))
.reshape((len(miindex), len(micolumns))),
index=miindex,
columns=micolumns).sort_index().sort_index(axis=1)
df = df.drop([('A2','B2'),('A2','B3')])
这里是起始df:
lvl0 a b
lvl1 bar foo bah foo
A B
A0 B0 38 16 1 31
B1 49 12 97 73
B2 76 26 17 34
B3 8 55 6 80
A1 B0 40 94 57 0
B1 21 23 45 78
B2 36 31 89 18
B3 46 31 57 94
A2 B0 46 98 62 97
B1 89 26 93 95
问题是:如何创建一个新索引,以便在每个具有B2 和B3 条目的A 中,如果B3 < B2 则B4 = B3 / B2 否则B4 = 0;
我希望结果会是这样的:
lvl0 a b
lvl1 bar foo bah foo
A B
A0 B0 38 16 1 31
B1 49 12 97 73
B2 76 26 17 34
B3 8 55 6 80
B4 0.105 0 0.352 0
A1 B0 40 94 57 0
B1 21 23 45 78
B2 36 31 89 18
B3 46 31 57 94
B4 0 0 0.640 0
A2 B0 46 98 62 97
B1 89 26 93 95
这对我来说很难做到。我一整天都尝试使用pd.IndexSlice、get_level_values、boolean indexer 自己做这件事,但无济于事。真是令人沮丧。
感谢您提供的任何帮助。
【问题讨论】:
-
什么是
mklbl函数? -
我在上面的帖子中添加了
mklbl函数。很抱歉错过了这个。
标签: python pandas dataframe indexing multi-index