#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'])