【问题标题】:Assigning a float to subset returns 1将浮点数分配给子集返回 1
【发布时间】:2019-02-11 00:44:58
【问题描述】:

我正在尝试将浮点 0.3 分配给 pandas 中的子集,但结果返回值 1。但是如果我分配一个像12 这样的整数,它将返回12

df = pd.DataFrame({
    'A': ['A','B','C','D'],
    'Val1': [1,2,3,4],
    'Val2': [5,6,7,8]
})

df.set_index('A', inplace=True)
df.loc[:'D', 'Val1'].iloc[:-1] = 0.3 // returns 1 instead of 0.3

【问题讨论】:

  • 您要在哪个位置分配值?问题不在于分配浮点数,而在于 loc 的语法
  • 试试 df.iloc[:3, 0] = 0.3

标签: python pandas indexing subset slice


【解决方案1】:

如果您先将 Val1 转换为浮点类型,则有效:

df.Val1 = df.Val1.astype(float)

完整示例:

df.set_index('A', inplace=True)
df.Val1 = df.Val1.astype(float)
df.loc[:'D', 'Val1'].iloc[:-1] = 0.3 
print(df)

[输出]

   Val1  Val2
A            
A   0.3     5
B   0.3     6
C   0.3     7
D   4.0     8

但是,我必须同意 @user3483203... 查看他关于正确使用 lociloc 的最佳实践的答案。

【讨论】:

    【解决方案2】:

    您使用loc 的方式很奇怪,我不建议将调用链接到ilocloc,而是正确分割DataFrame:

    df.loc[:-1, 'Val1'] = 0.3
    

       Val1  Val2
    A
    A   0.3     5
    B   0.3     6
    C   0.3     7
    D   4.0     8
    

    或明确:

    df.loc['A':'C', 'Val1'] = 0.3
    

    【讨论】:

    • 同意。我将lociloc 链接起来,因为我想将所有内容子集化到C不包括 C 本身。编辑:索引是一个动态的日期范围,所以我不会总是知道起点/终点
    【解决方案3】:

    loc

    df.loc[df.index[:-1], 'Val1'] = .3
    df
    
       Val1  Val2
    A            
    A   0.3     5
    B   0.3     6
    C   0.3     7
    D   4.0     8
    

    iloc

    df.iloc[:-1, df.columns.get_loc('Val1')] = .4
    df
    
       Val1  Val2
    A            
    A   0.4     5
    B   0.4     6
    C   0.4     7
    D   4.0     8
    

    【讨论】:

      猜你喜欢
      • 2015-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-06
      相关资源
      最近更新 更多