pandas 在python中将每个列表中的列名转换为数据框架?

aiqt4smr  于 2023-08-01  发布在  Python
关注(0)|答案(2)|浏览(124)

我有一个列表如下所示。如何将其转换为数据框架?

a = [["id = abc12", "value1=2.3", "value2=3.4"],["id = abcd4", "value1=4.6", "value2=3.45"],
         ["id = abr42", "value1=6.2", "value2=6.1"], ["id = abyt5",  "value2=1.06"],
         ["id = abndf1", "value1=3.21", "value2=8.65"],["id = abuz2", "value1=0.9", "value2=6.89"]]

    pd.DataFrame(a)

字符串


的数据
但是第3行的输出未正确对齐。我期待3列[id,valu1,value2]和相应的值,如果值不存在,那么列应该为null或na
预期输出:


f87krz0w

f87krz0w1#

您必须将数据转换为pandas可以理解的格式之一。例如,它可以是:

  • 具有行的列表的列表
  • dict column_name->whole column contents in a list
  • dict列表,其中list元素表示一行,dict为column_name->column contents for this row

后者似乎是你最直接的方法。我将把列表中的每个字符串拆分成元组,并将每个列表中的字符串转换成dict。
我还将数字自动转换为浮点数(而不是字符串)。如果value1value2中的值应该是字符串-删除函数try_cast及其应用程序。

import pandas as pd

def try_cast(value, cast_type=float):
    try:
        return cast_type(value)
    except ValueError:
        return value

def get_tuple(row_entity):
    parsed_row_entity = list(map(lambda x: try_cast(x.strip()), row_entity.split("=")))
    assert len(parsed_row_entity) == 2
    
    return tuple(parsed_row_entity)
    
df = pd.DataFrame([dict([get_tuple(entity) for entity in row]) for row in a])
print(df.dtypes)
print(df)

字符串
输出量:

id         object
value1    float64
value2    float64
dtype: object
       id  value1  value2
0   abc12    2.30    3.40
1   abcd4    4.60    3.45
2   abr42    6.20    6.10
3   abyt5     NaN    1.06
4  abndf1    3.21    8.65
5   abuz2    0.90    6.89

uttx8gqw

uttx8gqw2#

这里有一个方法:

df = (pd.DataFrame(
    df.stack()
    .str.split('=')
    .explode()
    .str.strip()
    .groupby(level=[0,1]).agg(tuple)
    .groupby(level=0).agg(lambda x: dict(list(x)))
    .tolist()))

字符串
输出量:

id value1 value2
0   abc12    2.3    3.4
1   abcd4    4.6   3.45
2   abr42    6.2    6.1
3   abyt5    NaN   1.06
4  abndf1   3.21   8.65
5   abuz2    0.9   6.89

相关问题