我有一个像这样的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'])作为我的条件时,我遇到同样的问题。
答案 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)