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

#python #pandas

Вопрос:

Мне нужно создать таблицы непредвиденных обстоятельств, но я знаю только, как это сделать отдельно.

Я создал фрейм данных ( df ) с информацией об одном disease age и delta (разница между прогнозируемым возрастом и реальным возрастом , где «0»,’1′,’-1′ являются нормальными/старше/младше возраста)

df = pd.DataFrame(np.array([[50,0,0],[42,1,1],[25,0,0], [25,1,1],[42,-1,0],[25,0,0]]),columns=['age', 'delta', 'disease'])

После этого я хочу создать df с помощью peolpe 25 лет, для этого я делаю:

df25 = df.loc[df['age'] == 25]

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

pd.crosstab(index=df25['disease'], columns=df25['delta'])

Теперь стол готов, но мой реал df такой большой, с множеством уникальных возрастов. Я попытался создать цикл, но это не увенчалось успехом. Не могли бы вы помочь мне автоматизировать этот процесс, пожалуйста? Мне нужна таблица для каждого возраста.

Ответ №1:

Вы можете создать словарь возрастных групп df.groupby() с помощью понимания диктанта, как показано ниже:

 age_dict = {k:v for k, v in df.groupby('age')}
 

Затем вы можете получить доступ к отдельной возрастной группе, например, 25 лет, по:

 age_dict[25]
 

Это даст тот же результат, что и вы, с помощью df25 = df.loc[df['age'] == 25] :

 print(age_dict[25])

   age  delta  disease
2   25      0        0
3   25      1        1
5   25      0        0
 

Вы можете получить список всех возрастных групп по:

 age_dict_keys = [*age_dict.keys()]
 

Результат:

 print(age_dict_keys)

[25, 42, 50]
 

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

 for key in age_dict_keys:
    print('==========================================')
    print('key=', key, 'ncrosstab:n', pd.crosstab(index=age_dict[key]['disease'], columns=age_dict[key]['delta']))
 

Выход:

 ==========================================
key= 25 
crosstab:
 delta    0  1
disease      
0        2  0
1        0  1
==========================================
key= 42 
crosstab:
 delta    -1   1
disease        
0         1   0
1         0   1
==========================================
key= 50 
crosstab:
 delta    0
disease   
0        1

 

Ответ №2:

Все таблицы непредвиденных обстоятельств приведены в d

 d=dict()
for age,values in df.groupby("age"):
    d.update({f"df{age}":pd.crosstab(index=values["disease"],columns=values["delta"])})
 

Ответ №3:

 unique_ages = df['age'].unique()

for age in unique_ages:
    df_temp = df.loc[df['age'] == age]
    # ... do something... save each df like so: df_temp.to_csv('table_for_age_'  str(age)   '.csv')
    # ... or just work with temp_df inside the loop... 
 

Комментарии:

1. Спасибо, но результат не является таблицей смежности

2. внутри цикла продолжайте работу с вашим кодом… temp_contigency_table = pd.crosstab(index=df_temp['disease'], columns=df_temp['delta'])