Извините за возможную путаницу в названии, вот что я пытаюсь сделать:
Я пытаюсь объединить мой фрейм данных Parcels с моей справочной таблицей кодов муниципалитетов.Кадр данных посылки:
df1.head()
PARID OWNER1
0 B10 2 1 0131 WILSON ROBERT JR
1 B10 2 18B 0131 COMUNALE MICHAEL J & MARY ANN
2 B10 2 18D 0131 COMUNALE MICHAEL J & MARY ANN
3 B10 2 19F 0131 MONROE & JEFFERSON HOLDINGS LLC
4 B10 4 11 0131 NOEL JAMES H
Код данных муниципального кодекса:
df_LU.head()
PARID Municipality
0 01 Allen Twp.
1 02 Bangor
2 03 Bath
3 04 Bethlehem
4 05 Bethlehem Twp.
Последние два числа в первом столбце df1 («31» в «B10 2 1 0131»)Муниципальный кодекс, который мне нужно объединить с Муниципальным кодексом DataFrame.Но в моих примерно 30 000 записей около 200 записей заканчиваются буквами, как показано ниже:
PARID OWNER1
299 D11 10 10 0131F HOWARD THEODORE P & CLAUDIA S
1007 F10 4 3 0134F KNEEBONE JUDY ANN
1011 F10 5 2 0134F KNEEBONE JUDY ANN
1114 F8 18 10 0626F KNITTER WILBERT D JR & AMY J
1115 F8 18 8 0626F KNITTER DONALD
Для этих строк два числа перед последней буквой - это код, который мне нужно извлечь (как '31' в 'D11 10 10 0131F')
Если я просто использую pd.DataFrame (df1 ['PARID']. str [-2:]) Это даст мне:
PARID
...
299 1F
...
В то время как мне нужно:
PARID
...
299 31
...
Мой код выполнения этого довольно длинный, который в значительной степени включает в себя:
- Соедините все строки, заканчивающиеся на 2числа.
- Найдите индекс строк, оканчивающихся буквой, в поле 'PARID'
- Снова объедините результаты шага 2 с рамкой данных муниципалитета.
Код есть:
#Do the extraction and merge for the rows that end with numbers
df_2015= df1[['PARID','OWNER1']]
df_2015['PARID'] = df_2015['PARID'].str[-2:]
df_15r =pd.merge(df_2015, df_LU, how = 'left', on = 'PARID')
df_15r
#The pivot result for rows generated from above.
Result15_First = df_15r.groupby('Municipality').count()
Result15_First.to_clipboard()
#Check the ID field for rows that end with letters
check15 = df_2015['PARID'].unique()
check15
C = pd.DataFrame({'ID':check15})
NC = C.dropna()
LNC = NC[NC['ID'].str.endswith('F')]
MNC = NC[NC['ID'].str.endswith('A')]
F = [LNC, MNC]
NNC = pd.concat(F, axis = 0)
s = NNC['ID'].tolist()
s
# Identify the records in s
df_p15 = df_2015.loc[df_2015['PARID'].isin(s)]
df_p15
# Separate out a dataframe with just the rows that end with a letter
df15= df1[['PARID','OWNER1']]
df15c = df15[df15.index.isin(df_p15.index)]
df15c
#This step is to create the look up field from the new data frame, the two numbers before the ending letter.
df15c['PARID1'] = df15c['PARID'].str[-3:-1]
df15c
#Then I will join the look up table
df_15t =df15c.merge(df_LU.set_index('PARID'), left_on = 'PARID1', right_index = True)
df_15b = df_15t.groupby('Municipality').count()
df_15b
Только когда я закончил, я понял, насколько длинным был мой код для, казалось бы, простой задачи.Если есть лучший способ добиться успеха, и это точно, пожалуйста, дайте мне знать.Спасибо.