Pandas DataFrame 中包含字典的列如何拆分?两种有效方法详解
2024-03-09 23:20:22
拆分 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 使用
get()
方法,它返回None
作为缺失值的默认值。方法 2 过滤掉具有缺失键值的项。 -
可以拆分具有不同键的字典列吗?
是的,你可以通过使用
unstack()
方法来转置数据帧,然后通过apply()
或stack()
方法拆分每个列。 -
拆分后的列名称是什么?
方法 1 使用指定的键作为列名称。方法 2 使用
'key'
作为键列的名称,你可以在重置索引时对其进行更改。 -
拆分后如何处理重复的行?
通常,你可能需要根据一个或多个键对重复行进行分组并对其进行聚合。方法 2 可以通过使用
groupby()
方法来实现此目的。 -
是否可以使用其他方法来拆分字典列?
是的,还有其他方法,例如使用
json_normalize()
函数或第三方库,例如pandas-profiling
。