python - 删除 Pandas Dataframe 中的非等效多索引行

标签 python pandas dataframe multi-index

目标

如果子列 min 等于子列 max 并且如果 minmax 子列在列的任何中都不相等(在本例中为 ao、his、cyp1a2s、cyp3a4s),删除该行。

示例

arrays = [np.array(['ao', 'ao', 'hia', 'hia', 'cyp1a2s', 'cyp1a2s', 'cyp3a4s', 'cyp3a4s']),
          np.array(['min', 'max', 'min', 'max', 'min', 'max', 'min', 'max'])]
tuples = list(zip(*arrays))
index = pd.MultiIndex.from_tuples(tuples, names=['',''])
df = pd.DataFrame(np.array([[1, 1, 0, 0, float('nan'), float('nan'), 0, 0], 
                            [1, 1, 0, 0, float('nan'), 1, 0, 0],
                            [0, 2, 0, 0, float('nan'), float('nan'), 1, 1],]), index=['1', '2', '3'], columns=index)
df

    ao      hia     cyp1a2s cyp3a4s
    min max min max min max min max
1   1.0 1.0 0.0 0.0 NaN NaN 0.0 0.0
2   1.0 1.0 0.0 0.0 NaN 1.0 0.0 0.0
3   0.0 2.0 0.0 0.0 NaN NaN 1.0 1.0

想要

df = pd.DataFrame(np.array([[1, 1, 0, 0, float('nan'), float('nan'), 0, 0]]), index=['1'], columns=index)
df

    ao      hia     cyp1a2s cyp3a4s
    min max min max min max min max
1   1.0 1.0 0.0 0.0 NaN NaN 0.0 0.0

尝试

df.apply(lambda x: x['min'].map(str) == x['max'].map(str), axis=1)

KeyError: ('min', 'occurred at index 1')

注意

实际数据框有 50 多列。

最佳答案

使用DataFrame.xs对于第二层MultiIndexDataFrame,替换NaNs:

df1 = df.xs('min', axis=1, level=1).fillna('nan')
df2 = df.xs('max', axis=1, level=1).fillna('nan')

或者将数据转为字符串:

df1 = df.xs('min', axis=1, level=1).astype('str')
df2 = df.xs('max', axis=1, level=1).astype('str')

DataFrame.eq 比较数据帧并通过 DataFrame.all 测试所有 True最后过滤 boolean indexing :

df = df[df1.eq(df2).all(axis=1)]
print (df)
    ao       hia      cyp1a2s     cyp3a4s     
   min  max  min  max     min max     min  max
1  1.0  1.0  0.0  0.0     NaN NaN     0.0  0.0

关于python - 删除 Pandas Dataframe 中的非等效多索引行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64999054/

相关文章:

python - 属性错误 : module 'collections' has no attribute 'MutableSequence' PYTHON/SMARTSHEET SDK

python - 使用 np.where 创建一个包含三个条件的新列

python - 如何删除QTreeWidgetItem

python Pandas : Counting element occurrences in series

python - 如何根据索引位置标准化 Pandas 数据框中的值?

python - Pandas 如何切片多索引数据帧?

python - 使用 unstack() 时将数据帧值应用于数据帧

python - 如何从 python panda 数据框中删除不需要的数据?

python - 从 python 中的字符串中删除除 URL 之外的所有内容

python - 在不安装所需模块的情况下运行 Python 程序