python (pandas) создание нового столбца на основе значений из разных строк - PullRequest
1 голос
/ 05 февраля 2020

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

     #F      E    G
0     1  n.e.   153
1     1     60   15
2     1     99   10
3     1      S   23
4     2  n.e.   190
5     2     60   44
6     2     99   22
7     2      S   67

Я хотел бы добавить к этому новый столбец.

Для каждой группы [#F] значение [G] в каждой строке должно быть разделено на значение [G] в строке, где [E] = 'ne' Итак, в конце концов, оно должно выглядеть так:

     #F      E    G     rel
0     1  n.e.   153   1.000
1     1     60   15   0.098
2     1     99   10   0.065
3     1      S   23   0.150
4     2  n.e.   190   1.000
5     2     60   44   0.232
6     2     99   22   0.116
7     2      S   67   0.353

Я пробовал несколько подходов с использованием функции, групп или np.where, но проблема немного сложнее, чем у меня есть опыт, и в конце концов ничего не получается.

Спасибо за вашу помощь.

Ответы [ 3 ]

0 голосов
/ 05 февраля 2020
df.loc[df['E'] == 'n.e.', 'G_ne'] = df['G']
df['G_ne'] = df['G_ne'].fillna(method='ffill')
df['rel'] = df['G'] / df['G_ne']

print(df)

Выход:

   #F     E    G   G_ne       rel
0   1  n.e.  153  153.0  1.000000
1   1    60   15  153.0  0.098039
2   1    99   10  153.0  0.065359
3   1     S   23  153.0  0.150327
4   2  n.e.  190  190.0  1.000000
5   2    60   44  190.0  0.231579
6   2    99   22  190.0  0.115789
7   2     S   67  190.0  0.352632
0 голосов
/ 05 февраля 2020

Я бы использовал Series.div. Создание серии с соответствующим значением n.e. для каждой группы с использованием Series.where и Groupby.transform.

Обратите внимание, что first, пропустите значения NaN, поэтому положение значения .ne. в группе не имеет значения. Мы также можем использовать max вместо first.

df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e.'))
                             .groupby(df['#F']).transform('first'))
print(df)
  #F     E    G       Rel
0  1  n.e.  153  1.000000
1  1    60   15  0.098039
2  1    99   10  0.065359
3  1     S   23  0.150327
4  2  n.e.  190  1.000000
5  2    60   44  0.231579
6  2    99   22  0.115789
7  2     S   67  0.352632

РЕДАКТИРОВАТЬ

df['Rel']=df['G'].div(df['G'].where(df['E'].eq('n.e. '))
                             .groupby(df['#F']).transform('first'))
0 голосов
/ 05 февраля 2020

IIU C transform

df['Rel']=df.G/df.groupby(['name','#F']).G.transform('max')
df
   name  #F     E    G       Rel
0  T.w.   1  n.e.  153  1.000000
1  T.w.   1    60   15  0.098039
2  T.w.   1    99   10  0.065359
3  T.w.   1     S   23  0.150327
4  T.w.   2  n.e.  190  1.000000
5  T.w.   2    60   44  0.231579
6  T.w.   2    99   22  0.115789
7  T.w.   2     S   67  0.352632

метод два

s=df.loc[df.E.eq('n.e.')].set_index(['name', '#F']).G.reindex(pd.MultiIndex.from_frame(df[['name', '#F']])).values
df['Rel']=df.G/s

Или

df['Rel']=df.G/df.G.mul(df.E.eq('n.e.')).groupby([df['name'],df['#F']]).transform('max')
df
   name  #F     E    G       Rel
0  T.w.   1  n.e.  153  1.000000
1  T.w.   1    60   15  0.098039
2  T.w.   1    99   10  0.065359
3  T.w.   1     S   23  0.150327
4  T.w.   2  n.e.  190  1.000000
5  T.w.   2    60   44  0.231579
6  T.w.   2    99   22  0.115789
7  T.w.   2     S   67  0.352632
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...