我是新蟒蛇,提前谢谢大家的帮助!
我在用Python完成一些在Excel中很容易做到的事情时遇到了很多麻烦。
我有一个熊猫数据框,看起来像这样:
df = pd.DataFrame(
{'c1': [1,2,3,4,5],
'c2': [4,6,7,None,3],
'c3': [0,None,3,None,4]})
请注意,我在列 c2
和 c3
列中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]
希望对您有所帮助。