Перебирая словарь Python и манипулируя каждым значением - PullRequest
1 голос
/ 11 апреля 2019

Я довольно новый пользователь Python и застрял в проблеме. Любое руководство будет с благодарностью.

У меня есть фрейм данных pandas с тремя столбцами «ID», «Intervention» и «GradeLevel». Смотрите код ниже:

 data = [[100,'Long', 0], [101,'Short', 1],[102,'Medium', 2],[103,'Long', 0],[104,'Short', 1],[105,'Medium', 2]]

intervention_df = pd.DataFrame(data, columns = ['ID', 'Intervention', 'GradeLevel'])

Затем я создал словарь фреймов данных, сгруппированных по «Вмешательству». Смотрите код ниже:

intervention_dict = {Intervention: dfi for Intervention, dfi in df.groupby('Intervention')}

Мой вопрос: можете ли вы перебирать значения словаря и манипулировать каждым значением словаря? В частности, я пытаюсь ссылаться на справочную таблицу. Таблица поиска может рассматриваться как список. Моя цель - пометить кого-либо в списке как «Да - Название вмешательства » или «Нет Интервенция ». Это становится непросто, потому что, скажем, у Long Intervention, например, есть только GradeLevel 0. Это означает, что я хотел бы пометить кого-либо в интервенционном файле с уровнем 0 как «Да - Длинный», а кого-то, кто не находится в интервале - как «Нет - Длинный». это станет новым столбцом под названием «Значение». Мне также необходимо создать другую переменную «Категория», которая будет указывать имя вмешательства, в этом примере это будет просто «Длинная»

lookup_data = [[100, 0], [101, 1],[102, 2],[103, 0],[104, 1],[105, 2], [106, 0], [107, 0],[108, 2],[109, 1]]
lookup_df = pd.DataFrame(lookup_data, columns = ['ID', 'GradeLevel'])

Например, словарь 'Long' будет выглядеть после обработки:

longint_data = [[100,'Long', 'Yes - Long'],[103,'Long', 'Yes - Long'], [106,'Long', 'No - Long'], [107,'Long', 'No - Long']]
longint_df = pd.DataFrame(longint_data, columns = ['ID','Category', 'Value'])

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

result_data = [[100,'Long', 'Yes - Long'] , [101,'Short','Yes - Short'], [102,'Medium','Yes - Medium'], [103,'Long', 'Yes - Long'], [104,'Short','Yes - Short'] , [105, 'Medium','Yes - Medium'], [106,'Long', 'No - Long'], [107,'Long', 'No - Long'], [108,'Medium','No - Medium'], [109,'Short','No - Short']]

result_df = pd.DataFrame(result_data, columns = ['ID','Category', 'Value'])

Спасибо!

Ответы [ 2 ]

2 голосов
/ 11 апреля 2019

Я чувствую, что ты идешь на это ... но без более четкого объяснения, я не уверен.

data = [[100,'Long', 0], [101,'Short', 1],[102,'Medium', 2],[103,'Long', 0],[104,'Short', 1],[105,'Medium', 2]]
intervention_df = pd.DataFrame(data, columns = ['ID', 'Intervention', 'GradeLevel'])

lookup_data = [[100, 0], [101, 1],[102, 2],[103, 0],[104, 1],[105, 2], [106, 0], [107, 0],[108, 2],[109, 1]]
lookup_df = pd.DataFrame(lookup_data, columns = ['ID', 'GradeLevel'])


df= pd.merge(intervention_df.assign(y='Yes'), lookup_df, on=['ID', 'GradeLevel'], how='outer')
df.loc[df.y.isnull(), 'y'] = 'No'


    ID Intervention  GradeLevel    y
0  100         Long           0  Yes
1  101        Short           1  Yes
2  102       Medium           2  Yes
3  103         Long           0  Yes
4  104        Short           1  Yes
5  105       Medium           2  Yes
6  106          NaN           0   No
7  107          NaN           0   No
8  108          NaN           2   No
9  109          NaN           1   No
1 голос
/ 12 апреля 2019

Здесь решение без использования словаря intervention_dict.Ниже приведены ваши данные, которые я получаю из ваших команд:

In [1048]: intervention_df
Out[1048]:
    ID Intervention  GradeLevel
0  100         Long           0
1  101        Short           1
2  102       Medium           2
3  103         Long           0
4  104        Short           1
5  105       Medium           2

In [1049]: lookup_df
Out[1049]:
    ID  GradeLevel
0  100           0
1  101           1
2  102           2
3  103           0
4  104           1
5  105           2
6  106           0
7  107           0
8  108           2
9  109           1

Шаг 1 : Выполнение внешнего слияния между lookup_df и intervention_df, создание столбца Value и set_indexGradeLevel

In [1059]: df = lookup_df.merge(intervention_df, on=['ID', 'GradeLevel'], how='outer').assign(Value='Yes - '+intervention_df['Intervention']).set_index('GradeLevel')

In [1060]: df
Out[1060]:
             ID Intervention         Value
GradeLevel
0           100         Long    Yes - Long
1           101        Short   Yes - Short
2           102       Medium  Yes - Medium
0           103         Long    Yes - Long
1           104        Short   Yes - Short
2           105       Medium  Yes - Medium
0           106          NaN           NaN
0           107          NaN           NaN
2           108          NaN           NaN
1           109          NaN           NaN

Шаг 2: создайте df_fillna для заполнения NaN в df

In [1063]: df_fillna = intervention_df.groupby('Intervention').head(1).assign(Value='No - '+intervention_df['Intervention']).set_index('GradeLevel')

In [1064]: df_fillna
Out[1064]:
             ID Intervention        Value
GradeLevel
0           100         Long    No - Long
1           101        Short   No - Short
2           102       Medium  No - Medium

Шаг 3 (окончательный) : использованиеcombine_first для заполнения NaN в df из df_fillna значений и reset_index для удаления 'GradeLevel and doing sort_values ​​on ID`

In [1068]: df.combine_first(df_fillna).sort_values('ID').reset_index(drop=True)
Out[1068]:
    ID Intervention         Value
0  100         Long    Yes - Long
1  101        Short   Yes - Short
2  102       Medium  Yes - Medium
3  103         Long    Yes - Long
4  104        Short   Yes - Short
5  105       Medium  Yes - Medium
6  106         Long     No - Long
7  107         Long     No - Long
8  108       Medium   No - Medium
9  109        Short    No - Short
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...