np.and在pandas中,检查空列表

时间:2017-07-12 14:56:13

标签: python-3.x pandas

我有一个像这样的DataFrame:

df = pd.DataFrame({'var1':['a','b','c'],
                   'var2':[[],[1,2,3],[2,3,4]]})

我想创建第三列,如果var2中的相应列表为空,则给出var1中的值,否则返回var2中列表的第一个元素。所以我的预期结果是:

target = pd.DataFrame({'var1':['a','b','c'],
                       'var2':[[],[1,2,3],[2,3,4]],
                       'var3':['a',1,2]})

我尝试过像这样使用np.where:

df['var3'] = np.where(len(df['var2'])>0 , df['var2'][0], df['var1'])

但似乎是检查整列的长度而不是列的每一行中列表的长度。如何将条件应用于每一行?

当我使用bool(df ['var2'])作为我的条件时,我遇到同样的问题。

2 个答案:

答案 0 :(得分:2)

让我们使用.str访问器和len

df['var'] = np.where(df.var2.str.len() > 0, df.var2.str[0], df.var1)

输出:

  var1       var2 var
0    a         []   a
1    b  [1, 2, 3]   1
2    c  [2, 3, 4]   2

答案 1 :(得分:1)

您可以使用列表理解:

v3 = [row['var1'] if len(row['var2'])==0 else row['var2'][0] 
      for i, row in df.iterrows()]
df['var3']=v3

或者,您可以使用apply而不是where,将其应用于整个数据框:

首先,你需要一个在申请中使用的功能

def f(row):
    if len(row['var2'])==0:
        return row['var1']
    else:
        return row['var2'][0]

然后应用它:

df['var3']= df.apply(f,axis=1)