首页 > 解决方案 > 如何为列表中的每个列表创建一个新列

问题描述

我在列表中有列表,我想在我的数据框中为每个列表创建一个新列:

我的输入可以在下面看到:

datalist : [[abc1, abc2, abc3, abc4, abc5],[kh1, kh2, kh3, kh4],[jpor1, jpor2, jpor3, jpor4, jpor5]]

我中的每个项目datalist都是我现有数据框中的列标题,而每个索引也是我的数据框中的一列,其中包含我需要为我的新列提取值的数字。

所以我希望我的输出是这样的:

index    abc1     abc2     abc3     abc4    abc5    abc_result
4         87        94      34       28      43         28
2         87        94      34       28      43         94
5         87        94      34       28      43         43
4         87        94      34       28      43         28
1         87        94      34       28      43         87

因为我的数据列表中有 3 个列表,所以我希望创建 3 个新列并将其添加到数据框中,它们是abc_result, kh_result, jpor_result(全部基于索引列)。我真的很困惑,因为我觉得我需要为我的数据列表中的每个列表创建一个新列表,同时对新列标题进行字符串格式化?

所以基本上新列的值是基于索引列的值。如果值为 1,我想从 abc1 中提取 abc_result 的值,如果为 2,则从 abc2 中提取值,等等。然后 kh_result 的另一个新列也需要基于索引列的 kh1/kh2/kh3 中的值价值。

标签: pythonpandasdataframe

解决方案


你可以试试这个:

import pandas as pd
import numpy as np

datalist = [
    ["abc1", "abc2", "abc3", "abc4", "abc5"],
    ["kh1", "kh2", "kh3", "kh4"],
    ["jpor1", "jpor2", "jpor3", "jpor4", "jpor5"]
    ]


flat_list = [item for sublist in datalist for item in sublist]
column_groups= set([item[:-1] for sublist in datalist for item in sublist])

对于获得所需结果的逐行操作,您需要创建一个函数:

def grabber(row,key:str):
    return(row[key + str(row['index'])])

该函数根据列组指标的索引和键获取值。

剩下的就是迭代列组键并生成结果。让我们假设您的数据已经加载到df

df = <load the data>
for key in column_groups:

    df[key + '_result'] = df.apply(lambda x: grabber(x,key), axis=1)

但是,如果您的项目只有最后一个字符作为数字,则此代码有效。否则,您需要对可以在此处找到的每个子列表使用最长匹配算法。


推荐阅读