Манипулирование строками в фрейме данных, которые существуют в другом фрейме данных в пандах - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть датафрейм, содержащий все данные о моих тренировках, валидации и тестировании.И фрейм данных, содержащий только мои тестовые данные.Точки данных определяются с помощью 'data_index'.

df_all = pd.DataFrame({'data_index': range(7), 'split': 'NA'})
df_all.set_index('data_index', inplace=True)

df_test = pd.DataFrame({'data_index': [3, 5], 'split': 'test'})
df_test.set_index('data_index', inplace=True)



           split
data_index      
0             NA
1             NA
2             NA
3             NA
4             NA
5             NA
6             NA

           split
data_index      
3           test
5           test

как мне заполнить значения столбца 'split' в первом кадре данных на основе тестового кадра данных?Чтобы получить что-то вроде этого:

                split
data_index           
0           train/val
1           train/val
2           train/val
3                test
4           train/val
5                test
6           train/val

Ответы [ 2 ]

0 голосов
/ 06 февраля 2019

Помимо Index.map, как объяснено выше, проблему можно решить с помощью некоторых базовых концепций с использованием следующего подхода:

df = pd.merge(df_all, df_test, how='left', on='data_index')
df.drop(['split_x'], axis=1, inplace=True)
df = df.rename(columns={'split_y': 'split'})
df.loc[df.split != 'test', 'split'] = 'train/val'

Результат, следующий за каждой строкой:

          split_x split_y
data_index                
0               NA     NaN
1               NA     NaN
2               NA     NaN
3               NA    test
4               NA     NaN
5               NA    test
6               NA     NaN

           split_y
data_index        
0              NaN
1              NaN
2              NaN
3             test
4              NaN
5             test
6              NaN

           split
data_index      
0            NaN
1            NaN
2            NaN
3           test
4            NaN
5           test
6            NaN

                split
data_index           
0           train/val
1           train/val
2           train/val
3                test
4           train/val
5                test
6           train/val
0 голосов
/ 06 февраля 2019

Используйте Index.map с fillna:

df_all['split'] = df_all.index.map(df_test['split'].get)
df_all['split']= df_all['split'].fillna('train/val') 
print (df_all)
                split
data_index           
0           train/val
1           train/val
2           train/val
3                test
4           train/val
5                test
6           train/val

Если отсутствуют значения, используйте combine_first:

#defined np.nan for missing values, not string NA
df_all = pd.DataFrame({'data_index': range(7), 'split': np.nan})
df_all.set_index('data_index', inplace=True)

df_test = pd.DataFrame({'data_index': [3, 5], 'split': 'test'})
df_test.set_index('data_index', inplace=True)

df_all['split'] = df_all['split'].combine_first(df_test['split']).fillna('train/val') 
print (df_all)
                split
data_index           
0           train/val
1           train/val
2           train/val
3                test
4           train/val
5                test
6           train/val
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...