Я впервые пытаюсь использовать лямбда-функцию, пожалуйста, помогите мне определить, что я делаю неправильно. Я написал функцию для вывода часовых поясов на основе почтовых индексов. Функция работает, но не уверена, как реализовать ее как лямбда-функцию для создания нового столбца в моем кадре данных.
import pandas as pd
from pyzipcode import ZipCodeDatabase
zcdb = ZipCodeDatabase()
def find_tz(zip_code):
try:
tz = zcdb[zip_code].timezone
return tz
except:
return '?'
data = [['Jane','92804'], ['Bob','75014'], ['Ashley','07650']]
df = pd.DataFrame(data, columns=['Contact','Zip'])
in: df
out:
Contact Zip
0 Jane 92804
1 Bob 75014
2 Ashley 07650
Обратите внимание, что данные столбца с почтовым индексом являются строками, поскольку почтовые индексы США имеют начальные 0.
Я проверяю, что функция, которую я написал, работает со значениями из df:
in: print(find_tz(df.loc[0,'Zip']))
print(find_tz(df.loc[1,'Zip']))
print(find_tz(df.loc[2,'Zip']))
out:
-8
-6
-5
Моя попытка использовать лямбда-функцию для создания нового столбца часового пояса и неправильный результат, который я получаю:
in: df = df.assign(Timezone = lambda x: find_tz(x.Zip))
df
out:
Contact Zip Timezone
0 Jane 92804 ?
1 Bob 75014 ?
2 Ashley 07650 ?
Мой желаемый результирующий фрейм данных будет выглядеть так:
Contact Zip Timezone
0 Jane 92804 -8
1 Bob 75014 -6
2 Ashley 07650 -5
ETA: когда я изменил свою функцию find_tz() на что-то вроде объединения ввода с другой строкой текста, лямбда работала, как я и ожидал, поэтому я не уверен, что я сделал неправильно.
@DaniMesejo ха .. только что добавил часть lambda x
, и это сработало ... я хотел бы знать, почему мой исходный код не работал, чтобы я мог узнать, почему это не удалось! Спасибо! df = df.assign(Timezone = lambda x: x.Zip.apply(find_tz))
Вы можете использовать:
df['Timezone'] = df.Zip.apply(find_tz)
Когда вы вызываете lambda x: find_tz(x.Zip)
, функция find_tz передает серию Pandas, а не отдельные почтовые индексы.
Понятно, так что мне даже не нужно было lambda
. Почему, когда я определил свою функцию find_tz()
по-другому (например, tz = zip_code + " XXX"
, она дала мне столбец объединенных строк, как я и ожидал? (например: «92804 XXX»)
Когда приложение вызывает find_tz, аргумент zip_code представляет собой серию pandas. Вы можете использовать zip_code + «XXX» в серии панд, чтобы вызов работал. В приведенном выше случае вызов в блоке try завершился неудачно, так как поиск zcdb[zip_code] ожидал целое число
Попробуйте
df = df.assign(Timezone = x.Zip.apply(find_tz))