Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当单元格内容为列表时,从单元格中删除元素_Python_List_Pandas_Dataframe - Fatal编程技术网

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]