Pandas的DataFrame双转置改变数值类型为对象
我正在从Excel的两个不同位置读取数据,一个是表头,另一个是数据部分(这两个部分对齐但不相邻)。表头可能有很多空白,所以我需要去掉这些空白的表头和对应的数据列。最终我想得到的结果是,表头和数据都是非空的。下面的逻辑使用了转置的方法,但在进行两次转置后,我丢失了数据类型——具体的例子如下:
问题:
- 有没有什么建议可以让我在不使用转置的情况下实现这个目标?
- 转置的工作原理就是这样吗?难道在第二次转置时不应该重新推断数据类型吗?
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