【问题标题】:Delete columns with extremely unequally distributed values from pandas dataframe从熊猫数据框中删除具有极不均匀分布值的列
【发布时间】:2016-11-09 21:10:11
【问题描述】:

给定以下代码:

import numpy as np
import pandas as pd

arr = np.array([
    [1,2,9,1,1,1],
    [2,3,3,1,0,1],
    [1,4,2,1,2,1],
    [2,3,1,1,2,1],
    [1,2,3,1,8,1],
    [2,2,5,1,1,1],
    [1,3,8,7,4,1],
    [2,4,7,8,3,3]
    ])
#    1,2,3,4,5,6 <- Number of the columns.
df = pd.DataFrame(arr)

for _ in df.columns.values:
    print {x: list(df[_]).count(x) for x in set(df[_])}

我想从数据框中删除一个值出现频率高于该列的所有其他值的所有列。在这种情况下,我想删除第 4 列和第 6 列(见评论),因为数字 1 比这些列中的所有其他数字一起出现的频率更高(第 4 列中的 6 > 2 和第 6 列中的 7 > 1)。我不想删除第一列 (4 = 4)。我该怎么做?

【问题讨论】:

    标签: python pandas dataframe distribution data-cleaning


    【解决方案1】:

    另一种选择是对每一列进行值计数,如果计数的最大值小于或等于数据框行数的一半,则选择它:

    df.loc[:, df.apply(lambda col: max(col.value_counts()) <= df.shape[0]/2)]
    
    #   0   1   2   4
    #0  1   2   9   1
    #1  2   3   3   0
    #2  1   4   2   2
    #3  2   3   1   2
    #4  1   2   3   8
    #5  2   2   5   1
    #6  1   3   8   4
    #7  2   4   7   3
    

    【讨论】:

    • 这看起来非常简洁明了,但为什么要将 df.shape[0] 除以 2?这一步没看懂……
    • 根据逻辑,一个值比列的所有其他值一起出现的频率更高,这意味着最常出现的值应该比所有其他值的计数更少计数合并,因此不到总计数的一半。
    • 如果你提到的逻辑是正确的,它应该。你可以做一个简单的数学来验证这一点。假设您最频繁的值计数是 x,总行数是 n。因此,其他值计数组合为 n - x。而 x
    • 谢谢,这真的很好,解释得很好。我也很喜欢它,它适用于我的数据。你帮了我很多!
    • 或者也许使用 collections.Counter 它应该更快,例如。 df.ix[:, df.apply(Counter).apply(Counter.most_common).apply(lambda x: x[0][1] &lt;= sum(y[1] for y in x[1:]))]
    猜你喜欢
    • 2016-09-23
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-28
    相关资源
    最近更新 更多