我有一个很大的DataFrame
,有很多重复的值。唯一值存储在List1
中。我想做以下事情:
List1
中的每个组件添加到eq_list
。 简化的样本输入:
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)
我希望我已经明确了这个问题。
答案 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']