【问题标题】:python dataframe.at assignment with datatype changepython dataframe.at 赋值与数据类型更改
【发布时间】:2018-09-06 09:02:03
【问题描述】:

请查看代码和输出。

我可以知道为什么 *_state 列中的数据类型是 float 而不是 int 以及如何将这些数据类型转换为 int 吗?

谢谢,

代码

print(df_test)
for idx, row in df_test.iterrows():
    print(type(row['value']))
    df_test.at[idx, row['name'] + '_state'] = row['value']
print(df_test)

输出

消息名称值 0 Door_Started 门 1 1 Light_open 灯 1 输入'int' 输入'int' 消息名称值 Door_state Light_state 0 Door_Started 门 1 1.0 NaN 1 Light_open 灯光 1 NaN 1.0

【问题讨论】:

  • *_state 列是按需添加的,所以我想将这些列 dtype 转换为 int
  • 知道了。请检查编辑后的答案

标签: python python-3.x pandas


【解决方案1】:

您只是将整数分配给单个列row['name'] + '_state'。对于任何给定的索引,这会导致 NaN 值出现在其他列中。

NaN 被认为是 float (see here why),因此对于任何给定系列,int 和 NaN 的混合值将始终向上转换为 float1 .你可以自己检查一下:

type(np.nan)  # float

这通常不会破坏后续的操作/计算,并且保留您的系列float 是有效的。将这样的系列转换为int 是不可能的,并且变通方法效率低下。因此,我建议你什么都不做。


1docs:

注意:处理异构数据时,将选择生成的 ndarray 的 dtype 以容纳所有数据 涉及。例如,如果涉及字符串,结果将是 对象数据类型。如果只有浮点数和整数,则结果 数组将是 float dtype。

【讨论】:

    【解决方案2】:

    在代码之后使用这个:

    pd.options.display.float_format = '{:,.0f}'.format
    print(df)
    

    @Jpp 在那里是正确的。这只会改变您的视觉效果,因此您可以打印 1 而不是 1.0

    此外,如果使用此解决方案,请确保您也阅读了 pd.reset_option https://pandas.pydata.org/pandas-docs/stable/options.html

    【讨论】:

      猜你喜欢
      • 2017-11-02
      • 2013-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多