当单元格内容为列表时,从单元格中删除元素

时间:2018-07-17 09:56:58

标签: python list pandas dataframe

使用下面发布的数据框,我需要从列0中的每个单元格中删除元素Var2(每个单元格是一个列表),但仅对于其中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来完成此操作。

3 个答案:

答案 0 :(得分:1)

remove工作inplace(返回None),因此需要使用过滤功能来理解列表:

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]

答案 1 :(得分:1)

您可以将pd.Series.apply用于列表理解。您的代码不起作用,因为list.remove是就地操作,它返回None。有关更多详细信息,请参见here

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]

答案 2 :(得分:0)

尝试一下

if内部条件(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]