3 votes

Répartition de la ligne entre les autres lignes

Existe-t-il un moyen simple de répartir les lignes sur une autre ligne ?

Je veux diviser le pays inconnu entre tous les autres pays. Dans cet exemple, 2 pays. For a given date, UK = UK + (UK*Unknown)/sum(UK + US)

E.g. UK = 1 + (1*5)/(1+7) = 1 + 5/8 = 1.625  

df
  date       country col1  col2 
2019-12-20    UK      1    10
2019-12-20    Unknown 5    20
2019-12-20    USA     7    30
...

Expected Output

 df
  date       store     col1    col2 
2019-12-20    UK      1.625    15
2019-12-20    USA     11.375   45
...

2voto

ALollz Points 23271

Utiliser un groupby pour déterminer le nombre d'"inconnus" à une date donnée et le nombre d'inconnus dans tous les autres pays. Veillez à .fillna(0) dans le cas d'une date sans "Inconnu", afin que le calcul fonctionne par la suite sans aboutir à NaN . Nous pouvons ensuite fusionner ces informations et effectuer le calcul.

cols = ['col1', 'col2']
df1 = df.groupby(['date', df.country.eq('Unknown')])[cols].sum().unstack(-1).fillna(0)
df1.columns = [f'{x}_{y}' for x,y in df1.columns]
#            col1_False  col1_True  col2_False  col2_True
#date                                                    
#2019-12-20           8          5          40         20

# Bring over values and remove Unknown rows
df = df.merge(df1, on='date').query('country != "Unknown"')
#         date country  col1  col2  col1_False  col1_True  col2_False  col2_True
#0  2019-12-20      UK     1    10           8          5          40         20
#2  2019-12-20     USA     7    30           8          5          40         20

# Calculate and then drop helper columns
for col in cols:
    df[col] = df[col]*(1+df[f'{col}_True']/df[f'{col}_False'])

df = df.drop(columns=[x for x in df.columns if 'True' in x or 'False' in x])

         date country    col1  col2
0  2019-12-20      UK   1.625  15.0
2  2019-12-20     USA  11.375  45.0

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X