Pandas 从前两个级别具有重复索引的多级数据帧中删除行列表
我想从多层数据框中删除行索引列表,其中前两层有重复的条目。我想这是可能的,没有一个循环,但到目前为止,我还没有发现这一点 我试图通过提供一个列表行索引组合来使用pd.drop函数,尽管这并没有达到预期的效果。例如:Pandas 从前两个级别具有重复索引的多级数据帧中删除行列表,pandas,Pandas,我想从多层数据框中删除行索引列表,其中前两层有重复的条目。我想这是可能的,没有一个循环,但到目前为止,我还没有发现这一点 我试图通过提供一个列表行索引组合来使用pd.drop函数,尽管这并没有达到预期的效果。例如: import numpy as np import pandas as pd def mklbl(prefix, n): return ["%s%s" % (prefix, i) for i in range(n)] def src_rec(n, mult):
import numpy as np
import pandas as pd
def mklbl(prefix, n):
return ["%s%s" % (prefix, i) for i in range(n)]
def src_rec(n, mult):
src = [[no]*mult for no in range(1,n)]
src = [item for sublist in src for item in sublist]
rec = [no for no in range(1,n)]*mult
return src, rec
src, rec = src_rec(4,4)
miindex = pd.MultiIndex.from_arrays([src*2,
rec*2,
mklbl('C', 24)])
dfmi = pd.DataFrame(np.arange(len(miindex) * 2)\
.reshape((len(miindex), 2)),
index=miindex)
我想删除索引值为(1,2,:)和(2,3,:)的所有行
其结果是:
0 1
1 1 C0 0 1
2 1 C18 36 37
2 C19 38 39
3 3 C20 40 41
1 C21 42 43
2 C22 44 45
3 C23 46 47
而我期望的结果是:
0 1
1 1 C0 0 1
3 C2 4 5
1 C3 6 7
2 2 C4 8 9
1 C6 12 13
2 C7 14 15
3 3 C8 16 17
1 C9 18 19
2 C10 20 21
3 C11 22 23
1 1 C12 24 25
3 C14 28 29
1 C15 30 31
2 2 C16 32 33
1 C18 36 37
2 C19 38 39
3 3 C20 40 41
1 C21 42 43
2 C22 44 45
3 C23 46 47
循环中的一个例子是
for A, B in zip(As, Bs):
dfmi_drop_idx = CCdata.loc[(A, B, slice(None)), :].index
dfmi.drop(dfmi_drop_idx, inplace=True, errors='raise')
通过以下方式与测试成员一起使用:
感谢@jezrael,将其应用于30万行时肯定会更快;-)
for A, B in zip(As, Bs):
dfmi_drop_idx = CCdata.loc[(A, B, slice(None)), :].index
dfmi.drop(dfmi_drop_idx, inplace=True, errors='raise')
m = pd.MultiIndex.from_arrays([As,Bs])
df = dfmi[~dfmi.reset_index(level=2, drop=True).index.isin(m)]
print (df)
0 1
1 1 C0 0 1
3 C2 4 5
1 C3 6 7
2 2 C4 8 9
1 C6 12 13
2 C7 14 15
3 3 C8 16 17
1 C9 18 19
2 C10 20 21
3 C11 22 23
1 1 C12 24 25
3 C14 28 29
1 C15 30 31
2 2 C16 32 33
1 C18 36 37
2 C19 38 39
3 3 C20 40 41
1 C21 42 43
2 C22 44 45
3 C23 46 47