Python 将整数存储为整数而不是浮点数

Python 将整数存储为整数而不是浮点数,python,python-3.x,pandas,type-conversion,Python,Python 3.x,Pandas,Type Conversion,我做了以下工作: import pandas as pd df_texts = pd.read_csv('data_texts.csv', keep_default_na=True) for index, row in df_texts.iterrows(): list_of_words = row['text'].split() df_texts.loc[index, '#_words'] = len(list_of_words) list_of_uni

我做了以下工作:

import pandas as pd

df_texts = pd.read_csv('data_texts.csv', keep_default_na=True)

for index, row in df_texts.iterrows():   

    list_of_words = row['text'].split()

    df_texts.loc[index, '#_words'] = len(list_of_words)

    list_of_unique_words = set(list_of_words)  

    df_texts.loc[index, '#_unique_words'] = len(list_of_unique_words)
问题是
#u words
#u unique_words
列中的数字被存储为浮点数,即使它们是整数

为了澄清这两列在我读取的.csv(
pd.read_csv
)中不存在,但我在
for
循环中创建了它们


如何将它们直接存储为整数?

您可以将int函数应用于所需的列:

df= pd.DataFrame({
    'n':[1.12, 1.2345, 5.234]
})
df['n'] = df['n'].apply(lambda x: int(x))
df

这样做并直接获取ints的更好方法是直接分配新列,并避免完全迭代数据帧

以一些虚拟数据为例:

import pandas as pd
texts = ['word1 word2 word3', 'word1 word2 word1', 'word3']

df_texts = pd.DataFrame(texts, columns = ['text'])
                text
0  word1 word2 word3
1  word1 word2 word1
2              word3
分别使用文本列计算所有行的长度,然后指定

temp = df_texts['text'].str.split()
df_texts['#_words'] = [len(row) for row in temp] #iterates and creates a list of all lengths. assign to df
df_texts['#_unique_words'] = [len(set(row)) for row in temp]

print(df_texts)
#Output:
                text  #_words  #_unique_words
0  word1 word2 word3        3               3
1  word1 word2 word1        3               2
2              word3        1               1

如果通过为单行赋值来创建列,则所有其他行都会隐式初始化为
NaN
,这是一个浮点值。这将强制整个列浮动

(如果在设置所有值之前尝试使用
df#u text['#u words']=df#u text['#u words']转换列,您也会注意到这一点。aType(int)
将失败,因为
NaN
无法转换为
int

因此,在设置所有值之前,该列不能成为整数列。如果在循环之前使用
df_text['#u words']=0初始化整个列,则问题就会消失


编辑:另外,正如其他答案所指出的,这个赋值可以不使用循环就完成。

@iamklaus很酷,但我的问题是:如何将它们直接存储为整数?在列中插入值后更改列数据类型,或者创建一个值列表,然后再插入。我想我也可以使用
pd.to\u numeric()
(这可能比您上面的解决方案更有效)但我仍然在寻找(如果存在的话)更有效的解决方案。
temp = df_texts['text'].str.split()
df_texts['#_words'] = [len(row) for row in temp] #iterates and creates a list of all lengths. assign to df
df_texts['#_unique_words'] = [len(set(row)) for row in temp]

print(df_texts)
#Output:
                text  #_words  #_unique_words
0  word1 word2 word3        3               3
1  word1 word2 word1        3               2
2              word3        1               1