首页 > 解决方案 > 如何防止 pandas loc 转置单个项目数据框

问题描述

当我对单个元素 DataFrame 对象执行 loc 时,它被转置并转换为 float64 类型。这是要重现的示例代码:

from pandas import read_excel, DataFrame
import pandas as pd
import numpy as np

rowNames = ['Name0', 'Name1', 'Name2', 'Name3']

df = DataFrame(
    [[3, 1366.436, 9.0],
    [3, 179.090, 14.0],
    [1, 322.297, 9.0],
    [1, 1604.821, 31.0],
    [8, 346.920, 20.0],
    [1, 2408.365, 31.0],
    [1, 765.352, 9.0],
    [1, 2295.521, 26.0],
    [8, 636.895, 20.0]],
    index=['Name0','Name0','Name1','Name1','Name1','Name2','Name3','Name3','Name3'],
    columns=['Layer', 'Length', 'Width']
    )

for i in range(len(rowNames)):
    print("Name = " +  str(rowNames[i]))
    nDF = df.loc[rowNames[i]]
    print(str(nDF) + "\n")

注意索引“Name2”发生了什么,因为它只有一项:

Name = Name0   
        Layer    Length  Width     
Name0      3  1366.436    9.0   
Name0      3   179.090   14.0   

Name = Name1   
        Layer    Length  Width     
Name1      1   322.297    9.0    
Name1      1  1604.821   31.0   
Name1      8   346.920   20.0   

Name = Name2    
Layer        1.000   
Length    2408.365   
Width       31.000   
Name: Name2, dtype: float64   

Name = Name3   
        Layer    Length  Width     
Name3      1   765.352    9.0   
Name3      1  2295.521   26.0   
Name3      8   636.895   20.0    

这会导致代码后面的下游混乱。
也许这种转换行为是意料之中的——但有没有办法覆盖它?
编辑以修复格式...希望它现在看起来更好(列有点排列)。

在此先感谢,
马克

标签: pythonpandas

解决方案


您可以传递一个列表loc,保证返回一个数据框:

for i in range(len(rowNames)):
    print("Name = " +  str(rowNames[i]))
    nDF = df.loc[rowNames[i:i+1]]  # difference here
    print(str(nDF) + "\n")

输出:

Name = Name0
       Layer    Length  Width
Name0      3  1366.436    9.0
Name0      3   179.090   14.0

Name = Name1
       Layer    Length  Width
Name1      1   322.297    9.0
Name1      1  1604.821   31.0
Name1      8   346.920   20.0

Name = Name2
       Layer    Length  Width
Name2      1  2408.365   31.0

Name = Name3
       Layer    Length  Width
Name3      1   765.352    9.0
Name3      1  2295.521   26.0
Name3      8   636.895   20.0

推荐阅读