Python 只在一列中去除带有 Nans 的行



我是新蟒蛇,提前谢谢大家的帮助!

我在用Python完成一些在Excel中很容易做到的事情时遇到了很多麻烦。

我有一个熊猫数据框,看起来像这样:

df = pd.DataFrame(
        {'c1': [1,2,3,4,5],
         'c2': [4,6,7,None,3],
         'c3': [0,None,3,None,4]})

请注意,我在列 c2c3 列中NaN值。我想删除所有带有NaN的行 c2.

所以结果应该看起来像这样:

c1: [1,2,3,5]
c2: [4,6,7,3]
c3: [0,Nan,3,4]

我尝试了各种列表理解,但它们要么包含错误,要么不会给我正确的结果。

我认为这很接近:

[x for x in df["c2"] if x != None]

对于纯粹的熊猫解决方案,您不需要列表理解:

df.dropna(subset=['c2'])

子集允许您选择要检查的列。

你非常接近:

d = {'c1': [1,2,3,4,5],
     'c2': [4,6,7,None,3],
     'c3': [0,None,3,None,4]}
for k in d:
  d[k] = [x  for x in d[k]  if x != None] 
df= pd.DataFrame(d)

由于所有列都存储为列表,因此您可以使用 c2.index(None) 在 c2 中获取 None 的索引。然后使用 pop() 从每个列表中删除该索引。更多文档在这里:https://docs.python.org/2/tutorial/datastructures.html

给定此数据:

data = {
    'c1':  [4,6,7,None,3], 
    'c2': [4,6,7,None,3], 
    'c3': [0,None,3,None,4]
}

删除一审:

可以最有效地删除等于None的值,如下所示:

ind = data['c2'].index(None)
data['c2'].pop(ind)

您可能希望实现一个函数来自动执行此操作:

def remove(data_set, item, value):
    ind = data_set[item].index(value)
    return data_set.pop[ind]

删除所有实例:

请注意,这将仅删除第一次出现的 None 或任何其他值。要有效地删除它们的所有匹配项而不进行迭代,您可能希望执行以下操作:

tmp = set(data['c2']) - set([None]*len(data['c2']))
data['c2'] = list(tmp)

或定义一个函数:

def remove(data_set, item, value):
    response = set(data_set[item]) - set([value] * len(data_set[item]))
    return list(response)

其中:

data['c2'] = remove(data, 'c2', None)

结果比较:

以上所有内容都返回c2

[4, 6, 7, 3]

前 2 个解决方案,应用于 c3 ,返回:

[0, 3, None, 4]

然而,最后 2 个解决方案如果应用于c3,则返回如下:

[0, 3, 4]

希望对您有所帮助。

最新更新