2017-07-12 63 views
0

我有這樣一個數據幀:np.where在熊貓,檢查空列表

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

我想創建一個第三列這給值VAR1如果VAR2相應的列表是空的,否則,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']) 

但它似乎是檢查整列的長度,而不是列表的長度在列的每一行中。我怎樣才能把它應用到每一行?

我有同樣的問題,當我使用布爾(DF [「VAR2」])作爲我的病情。

回答

1

讓我們用名爲.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

你可以使用列表理解:

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

或者,你可以使用應用來代替其中,將其應用於整個數據框:

首先,你需要一個函數來使用應用

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

然後應用它:

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