преобразовать один столбец в иерархический столбец из CSV - PullRequest
0 голосов
/ 16 мая 2018

Когда я импортирую файл CSV, в котором есть один столбец, состоящий из штатов и городов, например:

ALABAMA
NaN
Birmingham
Montgomery
Huntsville
NaN
CALIFORNIA
NaN
Los Angeles
San Diego
Fresno
NaN

У меня вопрос, как я могу преобразовать это в два иерархических столбца, чтобы он выглядел болеенапример:

ALABAMA    Birmingham
           Montgomery
           Huntsville
CALIFORNIA Los Angeles
           San Diego
           Fresno

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

Мой код:

i = 0
numcol = []
for STATE in city_state_df['citystate']:
    if STATE == '':        
        numcol.append(STATE_df['citystate'][i])
        i += 1
    elif STATE != '': 
        numcol.append(STATE_df['citystate'][i])
        i += 1
numcol

Ответы [ 2 ]

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

Другое (возможно, менее питонное решение) может быть таким:

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
0 голосов
/ 16 мая 2018

чтение данных в pandas DataFrame

df = pd.read_csv('my_file.csv')

Здесь я предполагаю, что столбец называется place.

Используйте groupby для группировки всех строк, начинающихся ссостояние (все заглавные буквы) до следующего состояния, выберите первый place для каждой группы (состояние) и назначьте его новому столбцу во фрейме данных

df['state'] = df.groupby(df.place.str.isupper().cumsum()).place.transform('first')

Затем удалите строки, в которыхplace это null или place == state

df[pd.notnull(df.place) & (df.place != df.state)]
outputs:
          place       state
2    Birmingham     ALABAMA
3    Montgomery     ALABAMA
4    Huntsville     ALABAMA
8   Los Angeles  CALIFORNIA
9     San Diego  CALIFORNIA
10       Fresno  CALIFORNIA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...