Python CSV中插入的列向下取整

Python CSV中插入的列向下取整,python,pandas,dataframe,Python,Pandas,Dataframe,我想插入一个新列,并在该列中写入我的计算结果,但Pandas会将新插入列的值向下舍入 fileName = 'File.dat' colnames=['junk', 'X', 'Y', 'P'] pd.options.display.precision = 10 df = pd.read_csv(fileName, sep = ' ', names=colnames, header=None) df.drop(df.columns[0],axis = 1, inplace = True)

我想插入一个新列,并在该列中写入我的计算结果,但Pandas会将新插入列的值向下舍入

fileName = 'File.dat'
colnames=['junk', 'X', 'Y', 'P'] 

pd.options.display.precision = 10

df = pd.read_csv(fileName, sep = ' ', names=colnames, header=None)
df.drop(df.columns[0],axis = 1, inplace = True)
df.insert(3,'S',0)

df['S'][0] = 2.731
我得到的结果是:

                X             Y             P  S
0   -0.6109808683 -0.6784414649   1.212175369  2
1   -0.6717514396 -0.6717514396   2.204230785  0
2   -0.6717514396 -0.6717514396   2.204230785  0
为什么“S”列中的值向下舍入?
如何停止此行为?

它似乎认为类型是整数。有许多方法可以解决这个问题,例如指定加载时的类型。或者,您可以简单地编写

df = pd.read_csv(fileName, sep = ' ', names=colnames, header=None)
df["S"] = df["S"].astype(float)

看起来它认为类型是整数。有许多方法可以解决这个问题,例如指定加载时的类型。或者,您可以简单地编写

df = pd.read_csv(fileName, sep = ' ', names=colnames, header=None)
df["S"] = df["S"].astype(float)

将列的数据类型更改为float,或者在插入列的默认值时将0更改为0.0

fileName = 'File.dat'
colnames=['junk', 'X', 'Y', 'P'] 

pd.options.display.precision = 10

df = pd.read_csv(fileName, sep = ' ', names=colnames, header=None)
df.drop(df.columns[0],axis = 1, inplace = True)
df.insert(3,'S',0.0)

df.loc[0,'S']= 2.731

将列的数据类型更改为float,或者在插入列的默认值时将0更改为0.0

fileName = 'File.dat'
colnames=['junk', 'X', 'Y', 'P'] 

pd.options.display.precision = 10

df = pd.read_csv(fileName, sep = ' ', names=colnames, header=None)
df.drop(df.columns[0],axis = 1, inplace = True)
df.insert(3,'S',0.0)

df.loc[0,'S']= 2.731

你把索引器锁起来了。您希望
df.loc[0,'S']=2.761
链接索引器。您希望
df.loc[0,'S']=2.761
不要链接索引器。使用
df.loc[0,'S']=2.731
@PaulH感谢您的更正。已经更新了应答器。不要链接索引器。使用
df.loc[0,'S']=2.731
@PaulH感谢您的更正。更新了回答我建议不要使用点访问器分配列。一般来说,很容易覆盖数据帧方法并在以后得到意外的结果。相反,请执行
df['S']=df['S'].astype(float)
df=df.assign(S=df['S'].astype(float))
@PaulH我明白你的意思,这是有道理的。另一方面,制表符补全在Jupyter中非常适用于点表示法,而不适用于字符串(无可否认,对于称为“S”的东西来说,这不是一个问题)。我认为这是一种折衷。FWIW,jupyer现在可以通过传统的访问器标记完整的数据帧名称。此外,人们可以很容易地想象一个名为“T”的列。这可能造成严重破坏。如果你知道你在做什么,点存取器是好的。但我认为我们不应该在SOTo引导上鼓励他们,如果列名中有特殊字符或空格,jupyter的数据帧特定字符串制表符完成会更好。@PaulH很高兴知道,谢谢!我想这不是我工作场所使用的版本。无论如何,更正了。我建议不要使用点访问器分配列。一般来说,很容易覆盖数据帧方法并在以后得到意外的结果。相反,请执行
df['S']=df['S'].astype(float)
df=df.assign(S=df['S'].astype(float))
@PaulH我明白你的意思,这是有道理的。另一方面,制表符补全在Jupyter中非常适用于点表示法,而不适用于字符串(无可否认,对于称为“S”的东西来说,这不是一个问题)。我认为这是一种折衷。FWIW,jupyer现在可以通过传统的访问器标记完整的数据帧名称。此外,人们可以很容易地想象一个名为“T”的列。这可能造成严重破坏。如果你知道你在做什么,点存取器是好的。但我认为我们不应该在SOTo引导上鼓励他们,如果列名中有特殊字符或空格,jupyter的数据帧特定字符串制表符完成会更好。@PaulH很高兴知道,谢谢!我想这不是我工作场所使用的版本。不管怎样,更正了。