Python 当单元格内容为列表时,从单元格中删除元素
使用下面发布的数据框,我需要从列Python 当单元格内容为列表时,从单元格中删除元素,python,list,pandas,dataframe,Python,List,Pandas,Dataframe,使用下面发布的数据框,我需要从列Var2中的每个单元格中删除元素0(每个单元格都是一个列表),但仅针对Var1>0的行 import numpy as np import pandas as pd df = pd.DataFrame({'Var1': [1,0,3,1], 'Var2': [[0,8],[6,0],[1,3,0],[5,0,3]] 我尝试了这个,但是输出不是我期望的-它似乎删除了单元格中的所有元素 df['Var2'] = df.appl
Var2
中的每个单元格中删除元素0
(每个单元格都是一个列表),但仅针对Var1>0
的行
import numpy as np
import pandas as pd
df = pd.DataFrame({'Var1': [1,0,3,1],
'Var2': [[0,8],[6,0],[1,3,0],[5,0,3]]
我尝试了这个,但是输出不是我期望的-它似乎删除了单元格中的所有元素
df['Var2'] = df.apply(lambda x: x['Var2'].remove(0) if x['Var1']>0 else x['Var2'], axis = 1)
╔══════════════╗
║ Var1 Var2 ║
╠══════════════╣
║ 1 None ║
║ 0 [6, 0] ║
║ 3 None ║
║ 1 None ║
╚══════════════╝
所需输出为:
╔══════════════╗
║ Var1 Var2 ║
╠══════════════╣
║ 1 [8] ║
║ 0 [6, 0] ║
║ 3 [1, 3] ║
║ 1 [5, 3] ║
╚══════════════╝
我做错了什么?此外,我想知道这是否可以在不使用
apply
删除工作inplace
(返回None
s)的情况下完成,因此需要通过筛选来理解列表:
f = lambda x: [y for y in x['Var2'] if y != 0] if x['Var1']>0 else x['Var2']
df['Var2'] = df.apply(f, axis = 1)
print (df)
Var1 Var2
0 1 [8]
1 0 [6, 0]
2 3 [1, 3]
3 1 [5, 3]
您可以与列表一起使用。您的代码不起作用,因为list.remove
是一个就地操作,返回None
。有关更多详细信息,请参阅
df = pd.DataFrame({'Var1': [1,0,3,1],
'Var2': [[0,8],[6,0],[1,3,0],[5,0,3]]})
def remove_zero(x):
return [i for i in x if i != 0]
df.loc[df['Var1'] > 0, 'Var2'] = df['Var2'].apply(remove_zero)
print(df)
Var1 Var2
0 1 [8]
1 0 [6, 0]
2 3 [1, 3]
3 1 [5, 3]
试试这个
在if
condition(Var1不等于零)块内找到0的索引并将其删除,然后返回列表并将结果保存回去
print df.apply(lambda x: list(np.delete(x['Var2'],x['Var2'].index(0))) if x['Var1']!=0 else x['Var2'],axis=1)
输入:
Var1 Var2
0 1 [0, 8]
1 0 [6, 0]
2 3 [1, 3, 0]
3 1 [5, 0, 3]
输出:
Var1 Var2
0 1 [8]
1 0 [6, 0]
2 3 [1, 3]
3 1 [5, 3]