
本教程详细介绍了如何在Pandas DataFrame中将包含NumPy数组的列(如键和值)高效地转换为独立的列。文章涵盖了两种主要场景:当所有行的键(keys)数组相同时,以及当键数组在不同行之间存在差异时。通过提供清晰的代码示例和步骤解释,旨在帮助用户将复杂的数据结构扁平化,提升数据分析的便利性和可读性。
在数据处理和分析中,我们经常会遇到DataFrame的某一列或几列中存储着复杂的数据结构,例如NumPy数组或列表。当这些数组或列表包含需要作为独立特征进行分析的数据时,将其展开为DataFrame的新列就显得尤为重要。本文将以一个常见场景为例:DataFrame中包含keys和values两列,它们分别存储着NumPy数组,我们的目标是将values数组中的元素根据keys数组中的对应键值,展开为新的DataFrame列。
我们将探讨两种核心情况:
为了更好地演示,我们首先创建一些示例数据框。
import pandas as pd
import numpy as np
# 场景一:keys数组在所有行中相同
source_df_identical_keys = pd.DataFrame(
[
['data_A1', 'data_B1', np.array(['key1', 'key2', 'key3']), np.array(['value1a', 'value2a', 'value3a'])],
['data_A2', 'data_B2', np.array(['key1', 'key2', 'key3']), np.array(['value1b', 'value2b', 'value3b'])],
['data_A3', 'data_B3', np.array(['key1', 'key2', 'key3']), np.array(['value1c', 'value2c', 'value3c'])]
],
columns=['Col A', 'Col B', 'keys', 'values']
)
print("原始数据框 (键相同):")
print(source_df_identical_keys)
# 场景二:keys数组在不同行中可能不同
source_df_non_identical_keys = pd.DataFrame(
[
['data_A1', 'data_B1', np.array(['key1', 'key2', 'key3']), np.array(['value1a', 'value2a', 'value3a'])],
['data_A2', 'data_B2', np.array(['key3', 'key4', 'key1']), np.array(['value3b', 'value4b', 'value1b'])],
['data_A3', 'data_B3', np.array(['key5', 'key2']), np.array(['value5c', 'value2c'])]
],
columns=['Col A', 'Col B', 'keys', 'values']
)
print("\n原始数据框 (键不同):")
print(source_df_non_identical_keys)当DataFrame中的keys列在所有行中都包含相同的NumPy数组时,我们可以利用这一特性进行高效的转换。这种情况下,我们只需要从任何一行获取一次键列表作为新列的名称。
这种方法涉及创建一个新的DataFrame来承载展开后的值,然后将其与原始DataFrame中不需要展开的列进行连接。
# 假设 source_df_identical_keys 是我们处理的数据框
df = source_df_identical_keys.copy()
# 1. 提取所有行的 'values' 列并转换为列表的列表
# 2. 使用第一行的 'keys' 作为新DataFrame的列名
# 3. 将原始DataFrame中不需要的 'keys' 和 'values' 列删除
# 4. 使用 join 方法将新生成的 DataFrame 连接回原始 DataFrame
result_df_identical_keys = (
df.drop(columns=['keys', 'values'])
.join(pd.DataFrame(df['values'].tolist(), columns=df['keys'].iloc[0]))
)
print("\n展开后的数据框 (键相同 - 方法一):")
print(result_df_identical_keys)代码解析:
如果你希望直接修改现有的DataFrame而不是创建一个新的,可以使用pop方法结合赋值操作。
# 假设 source_df_identical_keys 是我们处理的数据框
df_in_place = source_df_identical_keys.copy()
# 1. 使用 pop 方法移除 'keys' 列,并获取其第一行的值作为新列名
# 2. 使用 pop 方法移除 'values' 列,并将其转换为列表的列表,再用 pd.DataFrame 构造
# 3. 将新生成的 DataFrame 直接赋值给原始 DataFrame 的新列
df_in_place[df_in_place.pop('keys').iloc[0]] = pd.DataFrame(df_in_place.pop('values').tolist())
print("\n展开后的数据框 (键相同 - 方法二,原地修改):")
print(df_in_place)代码解析:
当keys数组在不同行中不一致时,我们需要更灵活的方法来处理。在这种情况下,简单地使用第一行的keys作为所有列名将不再适用,因为某些行可能不包含这些键,或者包含额外的键。
这种方法的核心思想是为每一行创建一个字典,将该行的keys映射到对应的values,然后将这些字典的列表转换为一个新的DataFrame。
# 假设 source_df_non_identical_keys 是我们处理的数据框
df = source_df_non_identical_keys.copy()
# 1. 遍历 'keys' 和 'values' 列,为每一行创建一个字典,将键映射到值
# 2. 将这些字典的列表传递给 pd.DataFrame 构造函数
# 3. 将原始DataFrame中不需要的 'keys' 和 'values' 列删除
# 4. 使用 join 方法将新生成的 DataFrame 连接回原始 DataFrame
result_df_non_identical_keys = (
df.drop(columns=['keys', 'values'])
.join(pd.DataFrame([dict(zip(k, v)) for k, v in zip(df['keys'], df['values'])]))
)
print("\n展开后的数据框 (键不同):")
print(result_df_non_identical_keys)代码解析:
输出示例分析 (键不同):
Col A Col B key1 key2 key3 key4 key5 0 data_A1 data_B1 value1a value2a value3a NaN NaN 1 data_A2 data_B2 value1b NaN value3b value4b NaN 2 data_A3 data_B3 NaN value2c NaN NaN value5c
可以看到,key1、key2、key3、key4、key5成为了新的列。对于第二行,由于其原始keys数组中没有key2,因此key2列在第二行显示为NaN。同样,对于第三行,key1、key3、key4显示为NaN。这种处理方式能够灵活地适应键不一致的场景。
通过掌握这些技术,您可以有效地将DataFrame中嵌套的NumPy数组结构扁平化,使其更易于进行数据探索、清洗和模型构建。
以上就是在Pandas DataFrame中展开NumPy数组为独立列的教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号