如何计算根据条件选择的一组行中的元素数?

时间:2016-05-14 15:35:34

标签: python python-3.x pandas

我有一个很大的DataFrame,有很多重复的值。唯一值存储在List1中。我想做以下事情:

  1. 选择包含列表中每个值的几行。
  2. 迭代选定的行并计算非NaN元素的数量
  3. 如果计数值大于或等于2,请将其存储在新列表中。仅当所有'eq'的计数值>> 2时,才应将List1中的每个组件添加到eq_list
  4. 简化的样本输入:

    List1 = ['A','B','C','D','E','F','G','H','X','Y','Z']
    
    Sample DF 'ABC':
    
            EQ1  EQ2   EQ3
    0       A    NaN   NaN
    1       X    Y     NaN
    2       A    X     C
    3       D    E     F
    4       G    H     B
    

    期望的输出:

    eq_list = ['B','C','D','E','F','G','H','X','Y']
    

    我试过的小码:

    for eq in List1:
        MCS=ABC.loc[MCS_old[:] ==eq]
        MCS = MCS.reset_index(drop=True)
        for index_new in range(0,len(MCS)-1):
            if int(MCS.iloc[[index_new]].count(axis=1))>2:
                eq_list.append(raw_input(eq))
                print(eq_list)
    

    我希望我已经明确了这个问题。

2 个答案:

答案 0 :(得分:1)

以下标识了具有超过2个非set值的行中出现的(唯一)值的NaN,从而消除了在非{2}的行中出现的值NaN }值。避免使用循环。

首先,获取set中不符合缺失值限制的部分中的df个唯一值(并添加.strip()以解决评论中提到的数据问题):

na_threshold = 1
not_enough_non_nan = df[df.count(axis=1) <= 1].values.flatten().astype(str)
not_enough_non_nan = set([str(l).strip() for l in not_enough_non_nan if not l == 'nan'])

{'A'}

接下来,确定符合您限制条件的set值:

enough_non_nan = df[df.count(axis=1) > 1].values.flatten().astype(str)
enough_non_nan = set([str(l).strip() for l in enough_non_nan if not l == 'nan'])

{'H', 'C', 'E', 'B', 'D', 'X', 'F', 'A', 'Y', 'G'}

最后,采取上述set之间的差异消除值并不总是符合限制:

result = sorted(enough_non_nan - not_enough_non_nan)

['B', 'C', 'D', 'E', 'F', 'G', 'H', 'X', 'Y']

答案 1 :(得分:1)

假设你有:

df
    EQ1 EQ2 EQ3
0   A   NaN NaN
1   X   Y   NaN
2   A   X   C
3   D   E   F
4   G   H   B

然后,您可以按照以下步骤进行操作:

dft = df.T
output_set = set()
prune_set =  set()
for column in dft:
    arr = dft[column].dropna().values
    if len(arr) >=2:
        output_set |= set(arr)
    else:
        prune_set |= set(arr)
sorted(output_set - prune_set)
['B', 'C', 'D', 'E', 'F', 'G', 'H', 'X', 'Y']