我是新的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]})
注意我在NaN
和c2
列中有c3
个值。
我想删除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]
答案 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
:
[0, 3, 4]
希望您觉得这很有帮助。