python - 将字符串化列表的列表转换为数据帧,同时维护索引

标签 python pandas

我有以下来自 API 源的数据帧,我试图整理数据,同时不大量更改我的原始数据帧(本质上不想做笛卡尔积)

data = ["[['Key','Metric','Value'],['foo','bar','4'],['foo2','bar2','55.21']]",
        "[['Key','Metric','Value'],['foo','bar','5']]",
        "[['Key','Metric','Value'],['foo','bar','6'],['foo1','bar1',''],['foo2','bar2','57.75']]"]

df = pd.DataFrame({'id' : [0,1,2],'arr' : data})

print(df)
      id                                                arr
0   0  [['Key','Metric','Value'],['foo','bar','4'],['...
1   1       [['Key','Metric','Value'],['foo','bar','5']]
2   2  [['Key','Metric','Value'],['foo','bar','6'],['...

Key Value Metric 告诉我想要做的数组的顺序是以字典的方式对其进行排序{key : value},其中键是连接的 KeyMetric 字段,值是嵌套列表的 -1 索引。

源数据是通过 Excel 和 MS Graph API 提供的,我不认为它会改变,但可能会改变,所以我正在尝试提出一个动态解决方案。

我的目标数据框是:

target_df = pd.DataFrame({'id' : [0,1,2],
                         'foo_bar' : [4,5,6],
                         'foo1_bar1' : [np.nan, np.nan,''],
                         'foo2_bar2' : [55.21, np.nan, 57.75]})

print(target_df)

   id  foo_bar  foo1_bar1  foo2_bar2
0   0        4        NaN      55.21
1   1        5        NaN        NaN
2   2        6                 57.75

我自己的尝试是使用 ast 库中的literal_eval 来获取第一个列表,该列表始终是Key Metric & Value 列 - 将来可能会有一个 Key MetricMetric2Value 字段 -因此我希望保持事物的动态。

总会有一个KeyValue字段。

自己的尝试:

from ast import literal_eval

literal_eval(df['arr'][0])[0]
#['Key', 'Value', 'Metric']

用这个我替换了列表字符并用 分割, 然后将结果转换为数据帧:

df['arr'].str.replace('\[|\]','').str.split(',',expand=True)

然而,在此之后我还没有明确的进展,并想知道我是否以错误的方式处理这件事?

最佳答案

尝试:

df2=df["arr"].map(eval).apply(lambda x: pd.Series({f"{el[0]}_{el[1]}": el[2] for el in x[1:]}))

df2["id"]=df["id"]

输出:

  foo_bar foo2_bar2 foo1_bar1  id
0       4     55.21       NaN   0
1       5       NaN       NaN   1
2       6     57.75             2

关于python - 将字符串化列表的列表转换为数据帧,同时维护索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59794852/

相关文章:

python - 为什么 pandas Series.str 将数字转换为 NaN?

python - 考虑字符串中(而不是模式中)自定义转义字符的正则表达式

python - 来自 2 个范围的 2 个元素的总和将是一个给定的数字

python - 考虑重叠情况下确定总时间的有效方法

python-3.x - df.mean()/jupyter/pandas 交替轴输出

python - 应用其参数取决于列值的函数

python - 将 ATLAS/MKL 链接到已安装的 Numpy

python - Sublime Text 2 控制台输入

python - 动态地将数组中的值分配给字典

Python Pandas DateOffset 使用另一列的值