Ошибка типа: должна быть str, а не int не может быть решена - PullRequest
0 голосов
/ 20 мая 2018

Исходные данные времени выглядят так:

df['time'][0:4]

   2015-07-08
        05-11
        05-12
   2008-07-26

Я хочу, чтобы все эти данные содержали значение года.И я применил это:

con_time = []

i=0
for i in df['time']:
    if len(df['time'])==5:
        time = '2018'+'-'+df['time']
        con_time.append(time)
        i +=1
    else:
        con_time.append(df['time']) 
        i +=1

Произошла ошибка:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-78-b7d87c72f412> in <module>()
      8     else:
      9         con_time.append(df['time'])
---> 10         i +=1

TypeError: must be str, not int

Эта ошибка настолько странная .... На самом деле я хочу создатьновый список, преобразуя его в массив np.array и объединяя его в df.У меня есть лучший способ достичь цели?

Ответы [ 2 ]

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

Так как вы спрашивали об альтернативном подходе.вместо явного цикла в python и заполнения списка лучше использовать методы DataFrame напрямую.В вашем случае это будет

df['time'].apply(lambda x: x if len(x) != 5 else '2018-'+x)

Это может работать быстрее для некоторых наборов данных

РЕДАКТИРОВАТЬ Я фактически выполнил тест времени, используя случайный набор игрушечных данных с ~ 50%полных и неполных дат.Короче говоря, кажется, что для небольшого набора данных простое решение для цикла быстрее для большого набора данных, оба метода показывают одинаковую производительность:

# 1M examples
import random
import numpy as np
y = pd.Series(np.random.randint(0,2,1000000))
s = {0:'2015-07-08',  1:'05-11'}
y = y.map(s)
%%timeit -n100
_ = y.apply(lambda x: x if len(x) != 5 else '2018-'+x)
>>> 275 ms ± 6.42 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100
con_time = []
for i in y:
    if len(i)==5:
        time = '2018-'+i
        con_time.append(time)
    else:
        con_time.append(i) 
con_time_a = np.array(con_time)
>>> 289 ms ± 5.23 ms per loop (mean ± std. dev. of 7 runs, 100 loops each)

# 1K examples
import random
import numpy as np
y = pd.Series(np.random.randint(0,2,1000))
s = {0:'2015-07-08',  1:'05-11'}
y = y.map(s)
%%timeit -n100
_ = y.apply(lambda x: x if len(x) != 5 else '2018-'+x)
>>> 431 µs ± 70.3 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
%%timeit -n100
con_time = []
for i in y:
    if len(i)==5:
        time = '2018-'+i
        con_time.append(time)
    else:
        con_time.append(i) 
con_time_a = np.array(con_time)
>>> 289 µs ± 40.4 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
0 голосов
/ 20 мая 2018

у вас есть две i переменные, когда вы делаете i += 1, вы берете i переменную из

for i in df['time']

не

i = 0 

изменяете i переменную из дляцикл с другим именем, например, если вам не нужна переменная from для статического цикла, вы можете назвать его _ (подчеркивание)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...