将嵌套列表展开为行,创建标题,并映射回原始列

2024-04-19 04:39:24 发布

您现在位置:Python中文网/ 问答频道 /正文

我想将嵌套列表扩展到多个行和列。同时,将结果映射回相应的列值。你知道吗

数据帧如下所示。你知道吗

df=pd.DataFrame({
'column_name':['income_level', 'geo_level'],
'results':[[[0, 12, 13], [0, 98, 43], [1, 29, 73], [2, 12, 34]], [[0, 78, 23], [1, 56, 67], [2, 67, 34]]]}) 

column_name  |  results
----------------------
income_level | [[0, 12, 13], [0, 98, 43], [1, 29, 73], [2, 12, 34]]
geo_level    | [[0, 78, 23], [1, 56, 67], [2, 67, 34]]

我想要的最终结果是这样的。(将嵌套列表展开为行和列,并匹配相应的列值)

column_name  | num |pct | index
income_level | 0   | 12 | 13 
income_level | 0   | 98 | 43
income_level | 1   | 29 | 73 
income_level | 2   | 12 | 34
geo_level    | 0   | 78 | 23
geo_level    | 1   | 56 | 67
geo_level    | 2   | 67 | 34

我的当前代码:

pd.DataFrame(list(itertools.chain(*df['results'].values.tolist())), columns=['num', 'pct', 'index'])

我可以展开并创建标题,但无法匹配回相应的列值(即列名称)


Tags: namedataframedf列表indexcolumnlevelresults
2条回答

尝试以下解决方案:

定义“重新格式化”函数:

def reform(row):
    res = pd.DataFrame(row.results, columns=['num', 'pct', 'index'])
    res.insert(0, 'column_name', row.column_name)
    return res

然后应用它并连接结果:

lst = df.apply(reform, axis=1).tolist()
pd.concat(lst).reset_index(drop=True)

Exploderesults并赋值给df1。从df1.resultsreset_index的子列表创建新的数据帧

df1 = df.explode('results')
pd.DataFrame(df1.results.tolist(), 
             index=df1.column_name,
             columns=['num', 'pct', 'index']).reset_index()

Out[562]:
    column_name  num  pct  index
0  income_level    0   12     13
1  income_level    0   98     43
2  income_level    1   29     73
3  income_level    2   12     34
4     geo_level    0   78     23
5     geo_level    1   56     67
6     geo_level    2   67     34

在pandas<;0.25上,使用sumnp.repeatreset_index实现相同的功能

pd.DataFrame(df.results.sum(), 
             index=np.repeat(df.column_name, df.results.str.len()), 
             columns=['num', 'pct', 'index']).reset_index()

Out[572]:
    column_name  num  pct  index
0  income_level    0   12     13
1  income_level    0   98     43
2  income_level    1   29     73
3  income_level    2   12     34
4     geo_level    0   78     23
5     geo_level    1   56     67
6     geo_level    2   67     34

相关问题 更多 >