Почему функция Python возвращает 1.0 (float), когда задано `return 1`? - PullRequest
0 голосов
/ 08 мая 2018

У меня много строк, некоторые из которых состоят из 1 предложения, а некоторые из нескольких предложений. Моя цель - определить, какие строки из одного предложения заканчиваются восклицательным знаком «!».

Мой код дает странный результат. Вместо того, чтобы возвращать «1», если он найден, он возвращает 1.0. Я попытался: return int(1), но это не помогает. Я довольно новичок в кодировании и не понимаю, почему это так и как я могу получить 1 как целое число?

'Sentences'                                                                        
0  [This is a string., And a great one!]      
1  [It's a wonderful sentence!]
2  [This is yet another string!]
3  [Strange strings have been written.]                
4  etc. etc.                                  

e = df['Sentences']

def Single(s):
    if len(s) == 1: # Select the items with only one sentence
        count = 0
        for k in s: # loop over every sentence
            if (k[-1]=='!'): # check if sentence ends with '!'
                count = count+1
        if count == 1: 
        return 1
    else:
        return '' 

df['Single'] = e.apply(Single)

Возвращает правильный результат, за исключением того, что должно быть «1» вместо «1.0».

'Single'                                                                        
0  NaN
1  1.0
2  1.0
3                                  
4  etc. etc.  

Почему это происходит?

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Причина np.nan считается float.Это делает серию типа float.Этого нельзя избежать, если вы не хотите, чтобы ваш столбец был типа Object [то есть что-нибудь].Это неэффективно и нежелательно, и я отказываюсь показывать вам, как это сделать.

Если есть альтернативное значение, которое вы можете использовать вместо np.nan, например, 0, то есть обходной путь.Вы можете заменить NaN значения на 0, а затем преобразовать в int:

s = pd.Series([1, np.nan, 2, 3])

print(s)
# 0    1.0
# 1    NaN
# 2    2.0
# 3    3.0
# dtype: float64

s = s.fillna(0).astype(int)

print(s)
# 0    1
# 1    0
# 2    2
# 3    3
# dtype: int32
0 голосов
/ 08 мая 2018

Использование astype(int)

Пример:

df['Single'] = e.apply(Single).astype(int)
...