使用Python将DataFrame转换为指定格式的嵌套列表矩阵
解决DataFrame转指定嵌套列表矩阵的问题
原始DataFrame
| product1 | product2 | time |
|---|---|---|
| Apple | Apple | 0 |
| Apple | Mango | 20 |
| Apple | Orange | 24 |
| Mango | Apple | 30 |
| Mango | Mango | 0 |
| Mango | Orange | 24 |
| orange | Apple | 12 |
| orange | orange | 0 |
| orange | mango | 24 |
需求
将上述DataFrame转换为指定格式的嵌套列表矩阵:
[[0,24,20],[12,0,24],[30,24,0]]
尝试的代码(未得到预期结果)
df.groupby(['product1','product2'])['time'].apply(list)
正确实现方法
问题出在两个核心点:一是原数据中产品名称大小写不统一(比如Orange和orange、Mango和mango),导致分组/透视时出现无效分类;二是groupby仅能生成多级索引的Series,无法直接输出目标矩阵结构。
步骤1:统一产品名称大小写
先把product1和product2列的名称格式统一(这里用首字母大写,也可选择全小写/全大写,只要保持一致即可):
df['product1'] = df['product1'].str.capitalize() df['product2'] = df['product2'].str.capitalize()
步骤2:透视表重塑数据
使用pivot方法将数据转换为宽表,行对应product1,列对应product2,值为time:
pivot_df = df.pivot(index='product1', columns='product2', values='time')
步骤3:调整行列顺序并转换为嵌套列表
根据期望输出的结构,指定行列的排序规则,再转换为嵌套列表:
# 匹配目标矩阵的行列顺序 target_order = ['Apple', 'Orange', 'Mango'] pivot_df = pivot_df.loc[target_order, target_order] # 转换为目标格式 result = pivot_df.values.tolist() print(result)
执行后输出结果即为:
[[0, 24, 20], [12, 0, 24], [30, 24, 0]]
完整可运行代码
import pandas as pd # 构建原始DataFrame data = [ ['Apple', 'Apple', 0], ['Apple', 'Mango', 20], ['Apple', 'Orange', 24], ['Mango', 'Apple', 30], ['Mango', 'Mango', 0], ['Mango', 'Orange', 24], ['orange', 'Apple', 12], ['orange', 'orange', 0], ['orange', 'mango', 24] ] df = pd.DataFrame(data, columns=['product1', 'product2', 'time']) # 统一大小写 df['product1'] = df['product1'].str.capitalize() df['product2'] = df['product2'].str.capitalize() # 透视+调整顺序+转列表 target_order = ['Apple', 'Orange', 'Mango'] pivot_df = df.pivot(index='product1', columns='product2', values='time').loc[target_order, target_order] result = pivot_df.values.tolist() print(result)
内容的提问来源于stack exchange,提问作者Jack
相关产品推荐
相关产品推荐

