熊猫列列表添加

时间:2019-03-07 09:50:49

标签: python pandas

我有一个pandas数据框列,其中包含大小可变的元素列表,而我还有另一个列表名称country = [A1,A2,A3]我的数据框就像:

A  B
1  [A1,A2]
2  [A1,A2,A4,A5]
3  [A7,A8,A9]

我想要的是列中存在的列表的长度不应该大于3。如果大于3,则如果长度小于3,则将其最后一个元素删除。然后从country_list追加不存在的那些值在熊猫列列表中。我的最终输出应为:

A   B
1   [A1,A2,A3]
2   [A1,A2,A4]
3   [A7,A8,A9]

5 个答案:

答案 0 :(得分:4)

您可以使用DataFrame.apply

country = ['A1', 'A2', 'A3']
df = pd.DataFrame({'A':[1,2,3, 4],
                 'B':[['A1', 'A2'], ['A1','A2','A4','A5'], ['A7','A8','A9'], ['A5']]})
df

    A   B
0   1   [A1, A2]
1   2   [A1, A2, A4, A5]
2   3   [A7, A8, A9]
3   4   [A5]

def new_list(x):
    if len(x)>=3:
        return x[:3]
    else:
        for val in country:
            if val not in x:
                x.append(val)
            if len(x)==3:
                return x

df['B'] = df['B'].apply(new_list)
df

    A      B                
0   1   [A1, A2, A3]
1   2   [A1, A2, A4]
2   3   [A7, A8, A9]
3   4   [A5, A1, A2]

答案 1 :(得分:3)

您可以附加不存在的值并通过使用Series.apply进行索引来过滤前三个值:

country=['A1','A2','A3']

def get_vals(x):
    if len(x) < 3:
        x += [y for y in country if y not in x]
    return x[:3]

df['B'] = df['B'].apply(get_vals)      
print (df)
   A             B
0  1  [A1, A2, A3]
1  2  [A1, A2, A4]
2  3  [A7, A8, A9]

第一个带有循环的解决方案:

out = []
for x in df['B']:
    if len(x) < 3:
        x += [y for y in country if y not in x]
    out.append(x[:3])

df['B'] = out     

答案 2 :(得分:2)

在一行中,它看起来像:

df['B'] = [l[:3] if len(l)>= 3 else (l + [i for i in country if i not in l])[:3] for l in df['B']]

答案 3 :(得分:0)

作为[y for y in country if y not in x]list(set(country).difference(x))的替代方法,您可以使用numpy.setdiff1d

np.setdiff1d(x, country)

(由于声誉限制而无法发表评论)

答案 4 :(得分:0)

您需要np.select

df=pd.DataFrame({'A':[1,2,3],'B':[['A1','A2'],['A1','A2','A4','A5'],['A7','A8','A9']]})
def add_new(x):
    return x + list(set(country).difference(x))

df['B']=np.select([(df['B'].str.len()<3),(df['B'].str.len() > 3 )],[df['B'].apply(add_new),df['B'].str[:3]],default=df['B'])

或建议使用单行,如@ 1b15

df['B']=np.select([(df['B'].str.len()<3),(df['B'].str.len() > 3 )],[np.setdiff1d(df['B'],country),df['B'].str[:3]],default=df['B'])