Pandas 基于可变长度的数据帧列中的索引列表

Pandas 基于可变长度的数据帧列中的索引列表,pandas,numpy,python-3.7,Pandas,Numpy,Python 3.7,在由可变长度列表组成的Pandas数据框架中有一列,我试图找到一种有效的方法来提取以列表长度为条件的元素。考虑这个最小可重复的例子: t = pd.DataFrame({'a':[['1234','abc','444'], ['5678'], ['2468','def']]}) 假设我想将第二个元素(相关的)提取到一个新列中,否则使用NaN。我能够以一种非常低效的方式获得它: _ = [] for in

在由可变长度列表组成的Pandas数据框架中有一列,我试图找到一种有效的方法来提取以列表长度为条件的元素。考虑这个最小可重复的例子:

t = pd.DataFrame({'a':[['1234','abc','444'],
                       ['5678'],
                       ['2468','def']]})
假设我想将第二个元素(相关的)提取到一个新列中,否则使用NaN。我能够以一种非常低效的方式获得它:

_ = []
for index,row in t.iterrows():
    if (len(row['a']) > 1): 
        _.append(row['a'][1])
    else:
        _.append(np.nan)
t['element_two'] = _
我尝试使用
np.where()
,但没有正确指定'if'参数:

np.where(t['a'].str.len() > 1, lambda x: x['a'][1], np.nan)
其他解决方案的更正和提示将不胜感激!我来自R,我认为矢量化是理所当然的


我使用的是pandas 0.25.3和numpy 1.18.1。

虽然效率不高,
应用至少是干净的:

t['a'].apply(lambda _: np.nan if len(_)<2 else _[1])

t['a'].应用(lambda:np.nan如果len(u)使用
str
accesor:

n = 2
t['second'] = t['a'].str[n-1]
print(t)
                  a second
0  [1234, abc, 444]    abc
1            [5678]    NaN
2       [2468, def]    def

这真是太棒了。我几乎被这件事的简单程度弄得心烦意乱。谢谢@Ansevb,但没有ansev的回答那么清晰!我仍然感谢你为我修复这件事。谢谢!