Другое (возможно, менее питонное решение) может быть таким:
city_state_df = pd.DataFrame({'citystate' :['ALABAMA', np.NaN, 'Birmingham', 'Huntsville', np.NaN,'CALIFORNIA',np.NaN, 'Los Angeles','San Diego',np.NaN]})
citystate
0 ALABAMA
1 NaN
2 Birmingham
3 Huntsville
4 NaN
5 CALIFORNIA
6 NaN
7 Los Angeles
8 San Diego
9 NaN
Скопируйте столбец и удалите строки, которые не являются прописными буквами в первом столбце, и строки, которые являются прописными буквами во втором. Используйте bfill
в первом и удалите строки, которые null
. В конце переименуйте столбцы
city_state_df['city'] = city_state_df['citystate']
city_state_df = city_state_df.replace(np.nan, '', regex=True)
city_state_df['citystate'] = city_state_df['citystate'].apply(lambda x: x if x.isupper() else np.NaN).ffill()
city_state_df['city'] = city_state_df['city'].apply(lambda x: np.NaN if x.isupper() else x)
city_state_df = city_state_df.replace('', np.NaN, regex=True).dropna(subset=['city'])
city_state_df.columns = ['state', 'city']
Выход:
state city
2 ALABAMA Birmingham
3 ALABAMA Huntsville
7 CALIFORNIA Los Angeles
8 CALIFORNIA San Diego