Pandas的DataFrame双转置改变数值类型为对象

2 投票
1 回答
2127 浏览
提问于 2025-04-18 12:49

我正在从Excel的两个不同位置读取数据,一个是表头,另一个是数据部分(这两个部分对齐但不相邻)。表头可能有很多空白,所以我需要去掉这些空白的表头和对应的数据列。最终我想得到的结果是,表头和数据都是非空的。下面的逻辑使用了转置的方法,但在进行两次转置后,我丢失了数据类型——具体的例子如下:

问题:

  1. 有没有什么建议可以让我在不使用转置的情况下实现这个目标?
  2. 转置的工作原理就是这样吗?难道在第二次转置时不应该重新推断数据类型吗?
  In [25]:

hd=pd.DataFrame({0:['num'],
                 1:np.nan,
                 2:['ltr']})
hd
Out[25]:
0   1   2
0    num    NaN  ltr
In [26]:

data=pd.DataFrame({0:np.arange(3),
                 1:['a','b','c'],
                 2:['d','e','f']})
data
Out[26]:
0   1   2
0    0   a   d
1    1   b   e
2    2   c   f
In [27]:

df=data.T[hd.iloc[0].notnull()].T
df.columns=hd.iloc[0].dropna()     
df
Out[27]:
num ltr
0    0   d
1    1   e
2    2   f
In [28]:

df.dtypes
Out[28]:
0
num    object
ltr    object
dtype: object

In [25]:

hd=pd.DataFrame({0:['num'],
                 1:np.nan,
                 2:['ltr']})
hd
Out[25]:
0   1   2
0    num    NaN  ltr
In [26]:

data=pd.DataFrame({0:np.arange(3),
                 1:['a','b','c'],
                 2:['d','e','f']})
data
Out[26]:
0   1   2
0    0   a   d
1    1   b   e
2    2   c   f
In [27]:

df=data.T[hd.iloc[0].notnull()].T
df.columns=hd.iloc[0].dropna()     
df
Out[27]:
num ltr
0    0   d
1    1   e
2    2   f
In [28]:

df.dtypes
Out[28]:
0
num    object
ltr    object
dtype: object

1 个回答

3

当你一开始有混合数据类型时,转置操作会把数据类型转换成object。这是正常的,因为数据类型是按列来定义的。如果你想重新推断这些数据类型,可以使用df.convert_objects()这个方法。

不过,你只需要这样做:

In [10]: data.loc[:,hd.iloc[0].notnull()]
Out[10]: 
   0  2
0  0  d
1  1  e
2  2  f

In [11]: data.loc[:,hd.iloc[0].notnull()].dtypes
Out[11]: 
0     int64
2    object
dtype: object

撰写回答