2017-01-08 2 views
1

Я еще новичок в Python и панд, так терпите меня ...Вычисление вероятности на основе нескольких переменных в dataframe панды

У меня есть dataframe пассажиров на корабле, который затонул. Я разбил это на другие dataframes мужчинами и женщинами, а также по классу, чтобы создать вероятность выживания. Я сделал функцию, которая сравнивает один dataframe к dataframe всех выжившим, и вычисляет вероятность выживания среди этой группы:

def survivability(total_pass_df, column, value): 
    survivors = sum(did_survive[column] == value) 
    total = len(total_pass_df) 
    survival_prob = round((survivors/total), 2) 
    return survival_prob 

Но теперь я пытаюсь сравнить живучесть среди небольших групп - мужчины пассажиров первого класса против например, пассажиры третьего класса. Я сделал dataframes для обеих этих групп, но я все еще не могу использовать мою функцию живучести, потому что я сравниваю две разные колонки - секс и класс, а не только один.

Я точно знаю, он с Python-петлями через «оставшийся» столбец (который является либо 1 или 0), в фрейме данных, если он равен 1, а затем добавляет его к значению индекса, и как только все данные пройдены, делите значение индекса по длине кадра данных, чтобы получить вероятность выживания ....

Но я должен использовать Панды для этого, и я не могу, чтобы жизнь меня работала в моей голове, как сделать это ....

:/

ответ

0

Без образца кадров данных, с которыми вы работаете, я не могу быть уверен, правильно ли понял ваш вопрос. Но, основываясь на описании процедуры чисто-Python,

Я точно знаю, как бы я сделать это с Python - через цикл «выжила» колонку (который является либо 1 или 0), в dataframe , если он равен 1, а затем добавить один к значению индекса, а после того, как все данные пройдены, разделите значение индекса на длину блока данных, чтобы получить вероятность выживания.

вы можете сделать это в Пандах простым письмом

dataframe['survived'].mean() 

Это все , Учитывая, что все значения равны 1 или 0, среднее будет числом 1, разделенным на общее количество строк.

Если вы начинаете с кадром данных, который имеет столбцы как survived, sex, class, и так далее, вы можете элегантно совместить это с булевой индексацией панд, чтобы выбрать курсы выживания для различных групп. Позвольте мне использовать Socialcops Titanic passengers data set в качестве примера для демонстрации. Предполагая, что DataFrame называется df, если вы хотите, чтобы анализировать только мужчин пассажиров, вы можете получить эти записи как

df[df['sex'] == 'male'] 

, а затем вы можете взять survived столбец , что и получить среднее значение.

>>> df[df['sex'] == 'male']['survived'].mean() 
0.19198457888493475 

Таким образом, сохранилось 19% пассажиров мужского пола.Если вы хотите, чтобы сузить пассажир второго класса мужского пола, вам необходимо объединить условия с помощью &, например:

>>> df[(df['sex'] == 'male') & (df['pclass'] == 2)]['survived'].mean() 
0.14619883040935672 

Это становится немного громоздким, но есть более простой способ, который на самом деле позволяет вам сделать несколько категорий одновременно. (Уловка заключается в том, что это несколько более совершенная техника Pandas, и для ее понимания может потребоваться некоторое время.) Используя метод DataFrame.groupby(), вы можете указать Pandas на группировку строк фрейма данных в соответствии с их значениями в определенных столбцах. Например,

df.groupby('sex') 

говорит панды сгруппировать строки по признаку пола: все мужчины пассажирские записи находятся в одной группе, и всех женщин, пассажирские записи в другой группе. То, что вы получаете от groupby(), не является DataFrame, это особый вид объекта, который позволяет применять функции агрегации, то есть функции, которые берут целую группу и превращают ее в одно число (или что-то еще). Так, например, если вы сделаете это

>>> df.groupby('sex').mean() 
      pclass survived  age  sibsp  parch  fare \ 
sex                  
female 2.154506 0.727468 28.687071 0.652361 0.633047 46.198097 
male 2.372479 0.190985 30.585233 0.413998 0.247924 26.154601 

      body 
sex     
female 166.62500 
male 160.39823 

вы видите, что для каждого столбца, панды занимают среднее по записям мужчин-пассажиров всех значений этого столбца, а также по всем записям женского пассажира. Все, что вы заботитесь о здесь является уровень выживаемости, поэтому просто использовать

>>> df.groupby('sex').mean()['survived'] 
sex 
female 0.727468 
male  0.190985 

Одно большое преимущество этого является то, что вы можете дать больше, чем один столбец группе, если вы хотите взглянуть на небольшие группы. Например, пол и класс:

>>> df.groupby(['sex', 'pclass']).mean()['survived'] 
sex  pclass 
female 1   0.965278 
     2   0.886792 
     3   0.490741 
male 1   0.340782 
     2   0.146199 
     3   0.152130 

(вы должны дать groupby список имен столбцов, если вы даете больше, чем один)

+0

О, да, я даже не думал о том, чтобы просто взять на себя выживание ... Я пытался найти способ использовать groupby() в этой проблеме, но я все еще нахожу его добрым путают. – Monika

+0

Это сбивает с толку, не волнуйтесь ;-) –

0

Вы пробовали слияния двух dataframes пассажирским ID, а затем делая сводную таблицу в Pandas с любыми промежуточными промежуточными итогами и aggfunc = numpy.mean?

import pandas as pd 
import numpy as np 

# Passenger List 
p_list = pd.DataFrame() 
p_list['ID'] = [1,2,3,4,5,6] 
p_list['Class'] = ['1','2','2','1','2','1'] 
p_list['Gender'] = ['M','M','F','F','F','F'] 

# Survivor List 
s_list = pd.DataFrame() 
s_list['ID'] = [1,2,3,4,5,6] 
s_list['Survived'] = [1,0,0,0,1,0] 

# Merge the datasets 
merged = pd.merge(p_list,s_list,how='left',on=['ID']) 

# Pivot to get sub means 
result = pd.pivot_table(merged,index=['Class','Gender'],values=['Survived'],aggfunc=np.mean, margins=True) 

# Reset the index 
for x in range(result.index.nlevels-1,-1,-1): 
    result.reset_index(level=x,inplace=True) 
print result 

    Class Gender Survived 
0  1  F 0.000000 
1  1  M 1.000000 
2  2  F 0.500000 
3  2  M 0.000000 
4 All   0.333333 
Смежные вопросы