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

Posted

技术标签:

【中文标题】根据数据框中的其他行值创建列【英文标题】:Creating column based on other row value in dataframe 【发布时间】:2021-09-15 05:19:40 【问题描述】:

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

类似的项目

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

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

【问题讨论】:

【参考方案1】:

一种选择是explode 然后map 使用来自Id.Item. 列的映射器,然后groupby aggregate 回到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)
)
   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.

DataFrame 构造函数:

import pandas as pd

df = pd.DataFrame(
    'Id.': [1.0, 2.0, 3.0, 4.0],
    'Item.': ['Pen.', 'Book.', 'Phone.', 'Laptop.'],
    'Similar_item_id': [[2, 1], [1, 4], 4, 3]
)

【讨论】:

【参考方案2】:

试试这样的,没有爆炸快,但更容易理解

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

【讨论】:

以上是关于根据数据框中的其他行值创建列的主要内容,如果未能解决你的问题,请参考以下文章

PySpark - 如何根据列中的两个值从数据框中过滤出连续的行块

Spark基于其他数据框中的列对数据框中的列进行重复数据删除

比较熊猫数据框中的行值

什么函数允许我根据R中列中的值从数据框中的列中提取数据?

根据列中的条件对数据框中的行进行子集/过滤

如何根据列中的最新日期聚合 pandas 数据框中的行?