我有 3 列 Id,item similar_item_id
例如:
Id. Item. Similar_item_id
1. Pen. [2,1]
2. Book. [1,4]
3. Phone. 4
4. Laptop. 3
我想创建一个名为 similar_item name 而不是它的 Id 的新列 喜欢
Similar_item
书,笔 笔,笔记本电脑 笔记本电脑 电话
如何在数据框中创建这个新列
答案 0 :(得分:2)
试试这个,不比explode快,但更容易理解
df['out'] = df.Similar_item_id.\
apply(lambda x : df.set_index('Id.').loc[x,'Item.'].tolist()
if type(x)==list
else df.set_index('Id.').loc[x,'Item.'] )
0 [Book., Pen.]
1 [Pen., Laptop.]
2 Laptop.
3 Phone.
Name: Similar_item_id, dtype: object
答案 1 :(得分:1)
一种选择是使用 Id.
和 Item.
列中的映射器 explode
然后 map
,然后 groupby aggregate
返回到 {{1 }}:
list
df['similar_item'] = (
df['Similar_item_id'].explode()
.map(dict(zip(df['Id.'], df['Item.'])))
.groupby(level=0).agg(list)
)
:
df
或者有条件地基于长度:
Id. Item. Similar_item_id similar_item
0 1.0 Pen. [2, 1] [Book., Pen.]
1 2.0 Book. [1, 4] [Pen., Laptop.]
2 3.0 Phone. 4 [Laptop.]
3 4.0 Laptop. 3 [Phone.]
df['similar_item'] = (
df['Similar_item_id'].explode()
.map(dict(zip(df['Id.'], df['Item.'])))
.groupby(level=0).agg(lambda g: list(g) if len(g) > 1 else g)
)
DataFrame 构造函数:
Id. Item. Similar_item_id similar_item
0 1.0 Pen. [2, 1] [Book., Pen.]
1 2.0 Book. [1, 4] [Pen., Laptop.]
2 3.0 Phone. 4 Laptop.
3 4.0 Laptop. 3 Phone.