Условно скопировать определенные значения строк в другие строки - PullRequest
0 голосов
/ 24 октября 2018

У меня есть фрейм данных, имеющий следующую структуру:

    code name age char
    101  NaN  NaN  ts
    101  NaN  NaN  tt
    101  Carl 19   tt
    102  NaN  NaN  ts
    102  NaN  NaN  tt
    102  NaN  NaN  tt
    103  NaN  NaN  ts
    103  Aoi  23   tt
    103  NaN  NaN  tt

Я хотел бы скопировать значения из столбцов «имя» и «возраст» в другие строки, при условии, что они существуют, с тем же «кодом»"и" символ ", являющийся" ts ".В результате я хотел бы получить следующий кадр данных:

    code name age char
    101  Carl 19   ts
    101  NaN  NaN  tt
    101  Carl 19   tt
    102  NaN  NaN  ts
    102  NaN  NaN  tt
    102  NaN  NaN  tt
    103  Aoi  23   ts
    103  Aoi  23   tt
    103  NaN  NaN  tt

Заранее спасибо за помощь!

Ответы [ 2 ]

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

В одной строке:

result = df.copy()

result.update(df.groupby(['code']).bfill()[df['char']=='ts'])

result

    code  name   age char
0  101.0  Carl  19.0   ts
1  101.0   NaN   NaN   tt
2  101.0  Carl  19.0   tt
3  102.0   NaN   NaN   ts
4  102.0   NaN   NaN   tt
5  102.0   NaN   NaN   tt
6  103.0   Aoi  23.0   ts
7  103.0   Aoi  23.0   tt
8  103.0   NaN   NaN   tt

Объяснено

Кадр данных заполняется строками с 'char' == 'ts', заполненными любым доступным значением для кодавыполнив:

df.groupby(['code']).bfill()
   code  name   age char
0   101  Carl  19.0   ts
1   101  Carl  19.0   tt
2   101  Carl  19.0   tt
3   102   NaN   NaN   ts
4   102   NaN   NaN   tt
5   102   NaN   NaN   tt
6   103   Aoi  23.0   ts
7   103   Aoi  23.0   tt
8   103   NaN   NaN   tt


df.groupby(['code']).bfill()[df['char']=='ts']

   code  name   age char
0   101  Carl  19.0   ts
3   102   NaN   NaN   ts
6   103   Aoi  23.0   ts
0 голосов
/ 24 октября 2018

Используйте GroupBy.apply с пропуском значений для прямого и обратного заполнения, а затем установите значения с помощью логической маски:

cols = ['name','age']
df1 = df.groupby(['code'])[cols].apply(lambda x: x.ffill().bfill())

mask = df['char'] == 'ts'
df.loc[mask, cols] = df1.loc[mask, cols]
print (df)
   code  name   age char
0   101  Carl  19.0   ts
1   101   NaN   NaN   tt
2   101  Carl  19.0   tt
3   102   NaN   NaN   ts
4   102   NaN   NaN   tt
5   102   NaN   NaN   tt
6   103   Aoi  23.0   ts
7   103   Aoi  23.0   tt
8   103   NaN   NaN   tt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...