Храните целые числа как целые числа, а не как числа с плавающей точкой - PullRequest
3 голосов
/ 31 мая 2019

Я делаю следующее:

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 хранятся как числа с плавающей запятой, даже если они являются целыми числами.

Просто чтобы уточнить, что эти два столбца не существуют заранее в .csv, который я прочитал (pd.read_csv), но я создаю их в цикле for.

Как я могу напрямую хранить их как целые числа?

Ответы [ 3 ]

1 голос
/ 31 мая 2019

Лучший способ сделать это и напрямую получить целые числа - это напрямую назначать новые столбцы и вообще избегать итерации по фрейму данных.

С некоторыми фиктивными данными для примера:

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
0 голосов
/ 31 мая 2019

Если вы создаете столбец, присваивая значение одной строке, все остальные строки неявно инициализируются равными NaN, что является значением с плавающей запятой.Это заставит весь столбец к float.

(Вы также заметите это, если попытаетесь преобразовать столбец, используя df_texts['#_words'] = df_texts['#_words'].astype(int) до того, как будут установлены все значения. Это не удастся, потому что NaN не может быть преобразованов int.)

Следовательно, столбец не может стать целочисленным столбцом, пока не будут установлены все значения.Проблема исчезнет, ​​если вы инициализируете весь столбец с помощью df_texts['#_words'] = 0 перед циклом.

Edit: Кроме того, как указывалось в других ответах, это назначение можно выполнить без использованияцикл в первую очередь.

0 голосов
/ 31 мая 2019

Вы можете применить функцию 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...