首页 > 解决方案 > 如何以安全的方式拆分同一列中的多个值,

问题描述

作为读取 pandas 数据框的程序的一部分。其中一列包含许多:在同一列中分隔的值。要了解这些值的含义,还有另一列说明每个值是什么。

我想拆分这些值并将它们放在新列中,问题是我的程序中并非所有输入都接收完全相同类型的数据框,并且可以出现顺序或新值。

用一个例子更容易解释:

df1

Column1     Column2
GT:AV:AD    0.1:123:23
GT:AV:AD    0.2:456:24


df2

Column1     Column2
GT:AD:AV    0.4:23:123
GT:AD:AV    0.5:12:323

在意识到这个问题之前,我将这些数据拆分并将它们放入新列中是这样的:

file_data["GT"] = file_data[name_sample].apply(lambda x: x.split(":")[1]) 
file_data["AD"] = file_data[name_sample].apply(lambda x: x.split(":")[2])

如果我想要的是 GT 和 AD(如果输入数据框中有),我该如何以更安全的方式执行此操作?

标签: python

解决方案


import pandas as pd
df = pd.DataFrame({"col1":["GT:AV:AD","GT:AD:AV"],"col2":["0.1:123:23","0.4:23:123"]})
df["keyvalue"] = df.apply(lambda x:dict(zip(x.col1.split(":"),x.col2.split(":"))), axis=1)
print(df)

输出

       col1        col2                                keyvalue
0  GT:AV:AD  0.1:123:23  {'GT': '0.1', 'AV': '123', 'AD': '23'}
1  GT:AD:AV  0.4:23:123  {'GT': '0.4', 'AD': '23', 'AV': '123'}

dict(zip(keys_list, values_list))说明:我使用构造作为dicts创建了包含键(来自 col1)和值(来自 col2)的列键值。applyaxis=1 对每一行应用函数,lambda在 python 中用于创建无名函数。如果您希望拥有而pandas.DataFrame不是带有dicts 的列,您可以这样做

df2 = df.apply(lambda x:dict(zip(x.col1.split(":"),x.col2.split(":"))), axis=1).apply(pd.Series)
print(df2)

输出

    GT   AV  AD
0  0.1  123  23
1  0.4  123  23

推荐阅读