我有下面的数据框架,其中col2是一个字典,有一个元组列表作为值.在整个数据帧中,密钥被一致地"添加"和"删除".

Input df

col1 col2
value1 {'added': [(59, 'dep1_v2'), (60, 'dep2_v2')], 'deleted': [(59, 'dep1_v1'), (60, 'dep2_v1')]}
value 2 {'added': [(61, 'dep3_v2')], 'deleted': [(61, 'dep3_v1')]}

下面是一个可复制粘贴的示例数据框:

jsons = ["{'added': [(59, 'dep1_v2'), (60, 'dep2_v2')], 'deleted': [(59, 'dep1_v1'), (60, 'dep2_v1')]}",
         "{'added': [(61, 'dep3_v2')], 'deleted': [(61, 'dep3_v1')]}"]

df = pd.DataFrame({"col1": ["value1", "value2"], "col2": jsons})

edit

col2直接来自diff_parsed field of pydriller输出

我想"爆炸"col2,以便获得以下结果:

Desired output

col1 number added deleted
value1 59 dep1_v2 dep1_v1
value1 60 dep2_v2 dep2_v1
value2 61 dep3_v2 dep3_v1

到目前为止,我try 了以下方法:

df = df.join(pd.json_normalize(df.col2))
df.drop(columns=['col2'], inplace=True)

上面的代码被简化了.我首先操纵该列,将其转换为正确的json.它试图先在"添加"和"删除"上爆炸,然后try 使用格式来获得我想要的...但是元组列表没有被保留,我得到了以下信息:

col1 added deleted
value1 59, dep1_v2, 60, dep2_v2 59, dep1_v1, 60, dep2_v1
value2 61, dep3_v1 61, dep3_v2

谢谢

推荐答案

这当然不优雅,但这里有一个潜在的解决方案,至少更容易理解和推理:

def explode_records(df):
    new_records = []
    def map_dict_to_row(value, col2_dict):
        temp = {}
        for number, added in col2_dict["added"]:
            temp[number] = {"value": value, "number": number, "added": added}
        for number, deleted in col2_dict["deleted"]:
            if number in temp:
                temp[number] = {**temp[number], "deleted": deleted}
            else:
                temp[number] = {"value": value, "deleted": deleted}
        new_records.extend(list(temp.values()))

    df.apply(lambda row: map_dict_to_row(row.col1, row.col2), axis=1)  # assumes col2 is a dict
    return pd.DataFrame(new_records)

用法:

In [4]: explode_records(df)
Out[4]:
     value  number    added  deleted
0   value1      59  dep1_v2  dep1_v1
1   value1      60  dep2_v2  dep2_v1
2  value 2      61  dep3_v2  dep3_v1

注意,我从你的原始数据中得到了value 2.我假设这只是一个输入错误,而不是你需要value x -> valuex个功能.

我无法让另一个解决方案工作,所以我无法将其性能与我的进行比较.

Python相关问答推荐

Flask:如何在完整路由代码执行之前返回验证

将嵌套列表的字典转换为数据框中的行

有没有方法可以修复删除了换码字符的无效的SON记录?

根据条件将新值添加到下面的行或下面新创建的行中

删除最后一个pip安装的包

如何在虚拟Python环境中运行Python程序?

用合并列替换现有列并重命名

Julia CSV for Python中的等效性Pandas index_col参数

用NumPy优化a[i] = a[i-1]*b[i] + c[i]的迭代计算

如何在Python脚本中附加一个Google tab(已经打开)

如何从数据库上传数据到html?

在ubuntu上安装dlib时出错

字符串合并语法在哪里记录

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

如何使regex代码只适用于空的目标单元格

如何在BeautifulSoup/CSS Select 器中处理regex?

numpy.unique如何消除重复列?

python—telegraph—bot send_voice发送空文件

导入错误:无法导入名称';操作';

OpenCV轮廓.很难找到给定图像的所需轮廓