Панды применяют функцию к каждой второй строке столбца - PullRequest
0 голосов
/ 29 сентября 2018

Я пытаюсь изменить текст в каждой второй строке после интерполяции числовых значений между строками.

    stamp     value
0   00:00:00  2
1   00:00:00  3
2   01:00:00  5

, пытаясь применить это изменение к каждой второй строке штампа (т.е. 30 вместо 00 между двоеточиями)- str column

    stamp     value
0   00:00:00  2
1   00:30:00  3
2   01:00:00  5

функция для изменения строки

def time_vals(row):
    #run only on odd rows (1/2 hr)
    if int(row.name) % 2 != 0:
        l, m, r = row.split(':')
        return l+":30:"+r

Я пробовал следующее:

hh_weather['time'] =hh_weather[hh_weather.rows[::2]['time']].apply(time_vals(2))

, но я получаю ошибку: AttributeError: 'DataFrame'У объекта нет атрибута' строки '

, и когда я пытаюсь:

hh_weather['time'] = hh_weather['time'].apply(time_vals)

AttributeError: у объекта' str 'нет атрибута' name '

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018
#convert string value to timedelta (better to work with time)
df['stamp']=pd.to_timedelta(df['stamp'])

#slicing only odd row's from `stamp` column and adding 30 minutes to all the odd row's
odd_df=pd.to_timedelta(df.loc[1::2,'stamp'])+pd.to_timedelta('30 min')

#updating new series (out_df) with the existing df, based on index.
df['stamp'].update(odd_df)

#print(df)
    stamp   value
0   00:00:00    2
1   00:30:00    3
2   01:00:00    5
0 голосов
/ 29 сентября 2018

Используйте timedelta вместо str

Сила Pandas заключается в векторизации функциональности.Здесь вы можете использовать timedelta для численного представления времени.Если данные такие же, как в вашем примере, т. Е. Секунды всегда равны нулю, вы можете указать пол часа и добавить 30 минут.Затем условно присвойте эту серию df['stamp'].

# convert to timedelta
df['stamp'] = pd.to_timedelta(df['stamp'])

# create series by flooring by hour, then adding 30 minutes
s = df['stamp'].dt.floor('h') + pd.Timedelta(minutes=30)

# assign new series conditional on index
df['stamp'] = np.where(df.index % 2, s, df['stamp'])

print(df)

     stamp  value
0 00:00:00      2
1 00:30:00      3
2 01:00:00      5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...