Как мне изменить этот набор данных в пандах Python? - PullRequest
0 голосов
/ 19 декабря 2018

Скажем, у меня есть такой набор данных:

is_a  is_b  is_c  population infected
1     0     1     50         20
1     1     0     100        10
0     1     1     20         10
...

Как мне изменить его форму, чтобы он выглядел так?

feature  0       1 
a        10/20   30/150
b        20/50   20/120
c        10/100  30/70
...

В исходном наборе данных у меня есть функции ab и c как отдельные столбцы.В преобразованном наборе данных эти же переменные перечислены в столбце feature, и создаются два новых столбца 0 и 1, соответствующие значениям, которые могут принимать эти функции.

В исходном наборе данных, где is_a равно 0, добавьте значения infected и разделите их на значения population.Если is_a равно 1, сделайте то же самое, добавьте значения infected и разделите их на значения population.Промойте и повторите для is_b и is_c.Новый набор данных будет иметь эти доли (или десятичные дроби), как показано.Спасибо!

Я пробовал pd.pivot_table и pd.melt, но ничто не близко к тому, что мне нужно.

Ответы [ 3 ]

0 голосов
/ 19 декабря 2018

Я пробовал это на вашем маленьком фрейме данных, но я не уверен, что он будет работать с большим набором данных.

dic_df = {}
for letter in ['a', 'b', 'c']: 
    dic_da = {}
    dic_da[0] = df[df['is_'+str(letter)] == 0].infected.sum()/df[df['is_'+str(letter)] == 0].population.sum()
    dic_da[1] = df[df['is_'+str(letter)] == 1].infected.sum()/df[df['is_'+str(letter)] == 1].population.sum()
    dic_df[letter] = dic_da
    dic_df
dic_df_ = pd.DataFrame(data = dic_df).T.reset_index().rename(columns= {'index':'feature'})

feature 0   1
0   a   0.5 0.200000
1   b   0.4 0.166667
2   c   0.1 0.428571
0 голосов
/ 19 декабря 2018

Здесь DF будет вашим исходным фреймом данных

Aux_NewDF = [{'feature': feature, 
               0       : '{}/{}'.format(DF['infected'][DF['is_{}'.format(feature.lower())]==0].sum(), DF['population'][DF['is_{}'.format(feature.lower())]==0].sum()), 
               1       : '{}/{}'.format(DF['infected'][DF['is_{}'.format(feature.lower())]==1].sum(), DF['population'][DF['is_{}'.format(feature.lower())]==1].sum())} for feature in ['a','b','c']] 



NewDF = pd.DataFrame(Aux_NewDF)

enter image description here

0 голосов
/ 19 декабря 2018

После выполнения wide_to_long ваш вопрос станет более понятным

df=pd.wide_to_long(df,['is'],['population','infected'],j='feature',sep='_',suffix='\w+').reset_index()
df
  population  infected feature is
0          50        20    a   1
1          50        20    b   0
2          50        20    c   1
3         100        10    a   1
4         100        10    b   1
5         100        10    c   0
6          20        10    a   0
7          20        10    b   1
8          20        10    c   1

df.groupby(['feature','is']).apply(lambda x : sum(x['infected'])/sum(x['population'])).unstack()
is      0         1
feature
a     0.5  0.200000
b     0.4  0.166667
c     0.1  0.428571
...