
本文详细介绍了如何在pandas dataframe中,将包含numpy数组的“键”和“值”列展开为新的独立列。文章提供了两种主要场景的解决方案:当键在所有行中一致时,以及当键在不同行中不一致时。通过使用`join`、`dataframe`构造函数和列表推导等方法,读者将学会如何高效地重塑数据结构,以满足分析和报告需求。
在数据处理和分析中,我们经常会遇到DataFrame中某些列包含列表或Numpy数组的情况。当这些数组中的元素需要作为新的独立列时,传统的宽窄表转换方法可能无法直接适用。本教程将深入探讨如何将DataFrame中包含Numpy数组的“键”(作为新列名)和“值”(作为新列数据)展开成新的列,同时覆盖键一致和键不一致两种常见场景。
首先,我们创建两个示例DataFrame,一个用于演示键一致的情况,另一个用于演示键不一致的情况。
import pandas as pd
import numpy as np
# 键一致的示例数据
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']
)
# 键不一致的示例数据
source_df_non_identical_keys = pd.DataFrame(
[
['data_X1', 'data_Y1', np.array(['key1', 'key2', 'key3']), np.array(['value1x', 'value2x', 'value3x'])],
['data_X2', 'data_Y2', np.array(['key3', 'key4', 'key1']), np.array(['value3y', 'value4y', 'value1y'])]
],
columns=['Col A', 'Col B', 'keys', 'values']
)
print("原始DataFrame (键一致):")
print(source_df_identical_keys)
print("\n原始DataFrame (键不一致):")
print(source_df_non_identical_keys)当DataFrame中的keys列在所有行中都包含相同的Numpy数组时,我们可以利用这个特性来高效地创建新列。
这种方法首先将原始的keys和values列删除,然后创建一个新的DataFrame,其列名取自keys列的第一行(因为所有行都相同),数据取自values列。最后,将这个新DataFrame与原始DataFrame的剩余部分进行连接。
# 复制一份DataFrame以避免修改原始数据
df_identical_keys = source_df_identical_keys.copy()
# 提取values并转换为列表,用第一行的keys作为列名
expanded_df = pd.DataFrame(df_identical_keys['values'].tolist(),
columns=df_identical_keys['keys'].iloc[0])
# 删除原始的'keys'和'values'列,然后与新生成的DataFrame连接
result_df_identical_keys_join = (df_identical_keys.drop(columns=['keys', 'values'])
.join(expanded_df))
print("\n展开后的DataFrame (键一致,使用join):")
print(result_df_identical_keys_join)代码解析:
如果希望直接修改原始DataFrame而不是创建新的DataFrame,可以使用 pop 方法。pop 方法会从DataFrame中移除指定的列并返回它们。
# 复制一份DataFrame以避免修改原始数据
df_identical_keys_inplace = source_df_identical_keys.copy()
# 使用pop移除'keys'列并获取其第一行的值作为新列名
new_columns = df_identical_keys_inplace.pop('keys').iloc[0]
# 使用pop移除'values'列并将其转换为DataFrame,然后赋值给新列名
df_identical_keys_inplace[new_columns] = pd.DataFrame(df_identical_keys_inplace.pop('values').tolist())
print("\n展开后的DataFrame (键一致,原地修改):")
print(df_identical_keys_inplace)代码解析:
当keys列在不同行中包含不同的Numpy数组时,上述方法不再适用,因为不能简单地取第一行的键作为所有列名。此时,我们需要更灵活的方法来处理可能出现的缺失值。
这种方法的核心思想是为每一行创建一个字典,将该行的键和值配对。然后,将这些字典的列表转换为一个新的DataFrame,它会自动处理不同行中存在的不同键,并用 NaN 填充缺失值。
# 复制一份DataFrame以避免修改原始数据
df_non_identical_keys = source_df_non_identical_keys.copy()
# 为每一行创建字典,将键和值配对
# 例如:{'key1': 'value1x', 'key2': 'value2x', 'key3': 'value3x'}
dict_list = [dict(zip(k, v)) for k, v in zip(df_non_identical_keys['keys'], df_non_identical_keys['values'])]
# 将字典列表转换为DataFrame
expanded_df_non_identical = pd.DataFrame(dict_list)
# 删除原始的'keys'和'values'列,然后与新生成的DataFrame连接
result_df_non_identical_keys = (df_non_identical_keys.drop(columns=['keys', 'values'])
.join(expanded_df_non_identical))
print("\n展开后的DataFrame (键不一致):")
print(result_df_non_identical_keys)代码解析:
通过本文介绍的这些方法,您可以灵活高效地将DataFrame中包含Numpy数组的列展开为独立的、可直接用于分析的新列,从而更好地组织和利用您的数据。
以上就是将Numpy数组从DataFrame列展开为独立列的实用指南的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号