Доля в пандах - PullRequest
       9

Доля в пандах

0 голосов
/ 09 октября 2018

У меня есть набор данных, который выглядит следующим образом

  Location  Type  Number
     House    A      4
              B      1
     Garden   A      3
              B      2

Я пытаюсь найти способ создать столбец пропорции типа B. В каждом месте.

Ожидаемый результат -

Location  Type  Number Proportion_B
 House    A      4        20%
          B      1        20%  
 Garden   A      3        40%
          B      2        40%

Как мне этого добиться?

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Я пробовал таким образом,

temp= df.groupby('Location').apply(lambda x: ((x[x['Type']=='B']['Number']/x['Number'].sum())*100)).reset_index().rename(columns={'Number':'Proportion_B'})
temp=temp[['Location','Proportion_B']]
temp['Proportion_B']=temp['Proportion_B'].astype(str).str.replace('\.0','')+'%'
df=pd.merge(df,temp,how='left',on=['Location'])

Вывод:

  Location Type  Number Proportion_B
0    House    A       4          20%
1    House    B       1          20%
2   Garden    A       3          40%
3   Garden    B       2          40%

Объяснение:

  1. Сгруппируйте элементы по Location, затем разделитеобщее число только с B и сохраните этот результат.
  2. Слияние временного результата с оригинальным df на основе Location' using left` merge.

Примечание: Строка2, строка 3 для получения того же образца вывода.

0 голосов
/ 09 октября 2018

Может быть, это на

df_temp = df.groupby('Location').apply(lambda x: ((x[x['Type']=='B']['Number']/x['Number'].sum())*100)).reset_index().rename(columns={'Number':'Proportion_B'})
df=pd.merge(df,df_temp,how='left',on=['Location'])
0 голосов
/ 09 октября 2018

Использование:

#create MultiIndex
df1 = df.set_index(['Location','Type'])
#if necessary aggregate sum per both levels
#df1 = df1.sum(level=[0,1])

#select B level and divide by sum
df2 = df1.xs('B', level=1).div(df1.sum(level=0), level=1).mul(100).add_prefix('prop_B_')
print (df2)
          prop_B_Number
Location               
House              20.0
Garden             40.0

#join to original DataFrame
df = df.join(df2, on='Location')
print (df)
  Location Type  Number  prop_B_Number
0    House    A       4           20.0
1    House    B       1           20.0
2   Garden    A       3           40.0
3   Garden    B       2           40.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...