使用下面发布的数据框,我需要从列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
来完成此操作。
答案 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]