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

时间:2016-04-22 23:16:37

标签: python pandas nan

我是新的python,请提前感谢您的帮助!

我在使用Python很容易在Excel中完成某些工作时遇到了很多麻烦。

我有一个像这样的pandas数据框:

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

注意我在NaNc2列中有c3个值。 我想删除NaNc2的所有行。

所以结果应该是这样的:

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

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

我认为这很接近:

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

4 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:0)

你非常接近:

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)

答案 2 :(得分:0)

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

答案 3 :(得分:0)

鉴于此数据:

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]

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

[0, 3, None, 4]

然而,如果应用于c3

,则最后2个解决方案返回如下
[0, 3, 4]

希望您觉得这很有帮助。