返回

Pandas DataFrame 中包含字典的列如何拆分?两种有效方法详解

python

拆分 Pandas DataFrame 中包含字典的列

简介

在处理数据时,我们经常会遇到包含字典值的列。将这些字典拆分为单独的列可以使数据更易于分析和操作。在这篇文章中,我们将探讨在 Pandas DataFrame 中拆分字典列的两种有效方法。

问题分析

字典列中项的长度可能不同,这是一个挑战。然而,在我们的示例中,所有字典只包含相同的三值:“a”、“b”和“c”,并且总是按相同的顺序出现(“a”第一,“b”第二,“c”第三)。

方法 1:使用 apply()

# 字典列表
dicts = df['Pollutants'].tolist()

# 创建空 DataFrame
df2 = pd.DataFrame()

# 循环遍历字典并添加列
for key in ['a', 'b', 'c']:
    df2[key] = df['Pollutants'].apply(lambda x: x.get(key))

优点:

  • 简单易懂。
  • 可灵活处理字典中可能存在的缺失键值。

缺点:

  • 循环遍历字典的效率较低,尤其是在处理大型 DataFrame 时。

方法 2:使用 stack()

# 将字典列展开为新行
df_stack = df['Pollutants'].stack()

# 重置索引以创建单独的列
df_stack = df_stack.reset_index(level=1, name='key')

# 过滤出特定的键
df2 = df_stack[df_stack['key'].isin(['a', 'b', 'c'])]

# 根据“Station ID”分组并求平均值
df2 = df2.groupby('Station ID').mean()

优点:

  • 使用 Pandas 内置函数,效率更高。
  • 无需循环遍历字典。

缺点:

  • 需要额外的步骤来过滤和分组数据。

解码 Unicode 字符串

如果你从 PostgreSQL 数据库中导入数据,字典值可能会以 Unicode 字符串格式存储。在将数据加载到 DataFrame 之前,将其解码非常重要:

# 将 Unicode 字符串解码为字典
dicts = [json.loads(x) for x in df['Pollutants']]

结论

拆分 Pandas DataFrame 中的字典列是一种常见的操作,可以使用 apply()stack() 方法轻松完成。根据数据的大小和结构,选择最适合的方法至关重要。

常见问题解答

  1. 如何处理缺失的键值?

    方法 1 使用 get() 方法,它返回 None 作为缺失值的默认值。方法 2 过滤掉具有缺失键值的项。

  2. 可以拆分具有不同键的字典列吗?

    是的,你可以通过使用 unstack() 方法来转置数据帧,然后通过 apply()stack() 方法拆分每个列。

  3. 拆分后的列名称是什么?

    方法 1 使用指定的键作为列名称。方法 2 使用 'key' 作为键列的名称,你可以在重置索引时对其进行更改。

  4. 拆分后如何处理重复的行?

    通常,你可能需要根据一个或多个键对重复行进行分组并对其进行聚合。方法 2 可以通过使用 groupby() 方法来实现此目的。

  5. 是否可以使用其他方法来拆分字典列?

    是的,还有其他方法,例如使用 json_normalize() 函数或第三方库,例如 pandas-profiling