【问题标题】:Pythonize function applied across columns in a pandas.Dataframe object在 pandas.Dataframe 对象中跨列应用的 Pythonize 函数
【发布时间】:2015-11-26 22:39:28
【问题描述】:

以下行将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() 的结果分配给数据框中每一列的变量名)

【问题讨论】:

  • "for ... in: 很丑" - 对我来说看起来不错。很清楚发生了什么,但不清楚为什么您认为有问题!
  • 您要转换所有列还是只转换某些列?
  • 这里碰巧这些都是列,但我实际上想(仅)转换给定列列表中的列。

标签: python pandas lambda dataframe list-comprehension


【解决方案1】:

我在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。

【讨论】:

    【解决方案2】:

    试试:

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

    据记录,applymap 用于逐元素应用 lambda 函数 (documentation)

    编辑

    第二种方法是:

    dft=dft.astype(int)

    我还没有计时。但是我认为第二种方式更pandaic

    【讨论】:

      猜你喜欢
      • 2014-05-20
      • 2021-07-13
      • 2013-01-14
      • 1970-01-01
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多