我有一个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]
答案 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'])