Pythonize函数应用于pandas.Dataframe对象中的列

时间:2015-11-26 22:39:28

标签: python pandas lambda dataframe list-comprehension

以下行将pandas.Dataframe对象中的所有列转换为数字。

columns = ['a', 'b']
dft = pd.DataFrame(data=[['1','2'], ['3','4'],['5','6']], columns=columns)
for col in columns:
    dft[col] = pd.to_numeric(dft[col])

效果很好,但for ... in:很难看。

我怎么能说使用lambda函数和/ list comprehension来使这个循环在一行中运行?

(我尝试了很多东西,但是我无法找到如何将pd.to_numeric()的结果分配给数据框中每列的变量名称。

2 个答案:

答案 0 :(得分:2)

我在github找到了解决方案。

print dft
print dft.dtypes
#   a  b  c
#0  1  2  5
#1  3  4  7
#2  5  6  9
#a    object
#b    object
#c    object
#dtype: object

dft1 = dft.apply(pd.to_numeric)

print dft1
print dft1.dtypes
#   a  b  c
#0  1  2  5
#1  3  4  7
#2  5  6  9
#a    int64
#b    int64
#c    int64
#dtype: object

dft[['a', 'b']] = dft[['a', 'b']].apply(pd.to_numeric)
print dft
print dft.dtypes
#   a  b  c
#0  1  2  5
#1  3  4  7
#2  5  6  9
#a     int64
#b     int64
#c    object
#dtype: object

下一个解决方案是使用convert_objects,但会引发错误(v 0.17.0):

dft.convert_objects(convert_numeric=True)
  

FutureWarning:不推荐使用convert_objects。使用特定于数据类型的转换器pd.to_datetime,pd.to_timedelta和pd.to_numeric。

答案 1 :(得分:1)

尝试:

dft = dft.applymap(lambda x: int(x))

对于记录applymap用于元素地应用lambda函数(documentation

修改

第二种方式是:

dft=dft.astype(int)

我没有及时计算方法。我认为第二种方式更多是 pandaic