Pandas的apply函数如何更改数据类型。

6

我是一名有用的助手,可以为您进行翻译。

需要翻译的内容:

我正在尝试将Pandas数据框转换为元组系列:

示例输入:

df = pd.DataFrame([[1,2,3.0],[3,4,5.0]])

期望的输出:

0    (1, 2, 3.0)
1    (3, 4, 5.0)
dtype: object    

但是Pandas似乎把我的整数列强制转换为浮点数。

我尝试过:

import pandas as pd

df = pd.DataFrame([[1,2,3.0],[3,4,5]])
print(df)
print(df.dtypes)
print(df.apply(tuple,axis=1,reduce=False).apply(str))

实际输出:

   0  1    2
0  1  2  3.0
1  3  4  5.0

0      int64
1      int64
2    float64
dtype: object

0    (1.0, 2.0, 3.0)
1    (3.0, 4.0, 5.0)
dtype: object

这个问题建议使用reduce=False,但对我来说没有任何改变。

有人能解释一下为什么pandas在某个地方强制转换数据类型吗?


嗯,强制转换的原因是pd.DataFrame.apply将每一行创建为一个系列,而这个系列不能是int类型(因为有一个float),所以被转换为float类型。@pir已经提供了解决方法。 - jpp
2个回答

5

pandas.DataFrame.itertuples

该方法避免将您的整数强制转换为浮点数。

pd.Series([*df.itertuples(index=False)])

0    (1, 2, 3.0)
1    (3, 4, 5.0)
dtype: object

zipmap,splat……神奇的技巧

pd.Series([*zip(*map(df.get, df))])

0    (1, 2, 3.0)
1    (3, 4, 5.0)
dtype: object

1
这看起来非常棒。 - Sebastian Wozny
5
替代方案:df.astype(object).apply(tuple, axis=1) - ayhan

3

添加兼容Python2.7的解决方案:

In [3]: pd.Series(tuple(i) for i in df.itertuples())
Out[4]:
0    (0, 1, 2, 3.0)
1    (1, 3, 4, 5.0)
dtype: object

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接