我执行以下操作:
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)
问题是#_words
和#_unique_words
列上的数字即使是整数也存储为浮点数。
只是为了澄清这两列并不存在于我阅读的{。pd.read_csv
)中,而是在for
循环中创建的。
如何直接将它们存储为整数?
答案 0 :(得分:1)
这样做并直接获取整数的更好方法是直接分配新列,并避免完全遍历数据框。
以一些虚拟数据为例:
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
答案 1 :(得分:0)
您可以将int函数应用于所需的列:
df= pd.DataFrame({
'n':[1.12, 1.2345, 5.234]
})
df['n'] = df['n'].apply(lambda x: int(x))
df
n
0 1
1 1
2 5
答案 2 :(得分:0)
如果通过为单个行分配值来创建列,则所有其他行都隐式初始化为NaN
,这是一个浮点值。这会将整个列强制为float
。
(如果在设置所有值之前尝试使用df_texts['#_words'] = df_texts['#_words'].astype(int)
来转换列,您也会注意到这一点。它将失败,因为NaN
无法转换为int
。)< / p>
因此,在设置所有值之前,该列不能成为整数列。如果在循环之前用df_texts['#_words'] = 0
初始化整个列,问题就消失了。
编辑:此外,正如其他答案所指出的那样,无需首先使用循环即可完成此分配。