iloc用pandas float64 vs int64设置值

时间:2014-02-28 18:29:55

标签: python pandas

我基本上尝试使用带索引和列名的iloc在DataFrame中设置一个值。这是测试代码:

import pandas as pd

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
print type(df['a'][0])      # numpy.int64
df.iloc[-1]['a'] = 2000
print df                    # value changed to 2000
df['c'] = [3.5, 4.5]
print type(df['a'][0])      # numpy.float64 -> why does this change automatically?
print type(df['c'][0])      # numpy.float64
df.iloc[-1]['c'] = 2000     # yields warning, no value change
print df
df.iloc[-1]['a'] = 4000     # yields warning, no value change
print df

使用Int64,我可以做到,但不能使用Float64。还有其他选择吗?或者这是一个错误? 感谢

2 个答案:

答案 0 :(得分:3)

杰夫的回答是正确的,但不是最佳的熊猫语法。使用.at而不是.loc(以及.iat而不是.iloc)要快得多。如果您使用它来获取或设置很多值,那么节省的时间实际上可以增加。问题是.at和.iat仅用于获取和设置单个值,因此您无法获取或设置一系列值或检索整个列或行。因为您要做的就是更改一个我建议的值:

df.at[df.index[-1], 'a'] = 4000

如果出于某种原因,您只有一个轴的基于标签的位置和另一个轴上的基于整数的位置,您还可以使用df.get_loc('基于标签的列名')来获取整数 - 基于该列的位置或类似的df.index.get_loc('基于标签的行的名称')来获取该行的基于整数的位置。

答案 1 :(得分:2)

警告告诉你,你正在做的事情是不安全的,这是因为你 有一个混合型框架。而是使用loc来做这件事。请参阅文档,了解为什么这个不好的主意和可能不起作用(这里没有),http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy

In [12]: df.loc[df.index[-1],'a'] = 4000

In [13]: df
Out[13]: 
      a  b    c
0     1  3  3.5
1  4000  4  4.5

[2 rows x 3 columns]