根据数据框中的其他行值创建列

时间:2021-07-03 18:29:03

标签: python pandas dataframe numpy jupyter-notebook

我有 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

书,笔 笔,笔记本电脑 笔记本电脑 电话

如何在数据框中创建这个新列

2 个答案:

答案 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.