Заполните пропущенные значения в pandas кадре данных - PullRequest
3 голосов
/ 22 февраля 2020

У меня есть pandas фрейм данных с двумя столбцами: locationid, geo_lo c. В столбце locationid отсутствуют значения.

Я хочу получить значение geo_lo c отсутствующей строки locationid, затем выполнить поиск по этому значению geo_lo c в столбце geo_lo c и получить идентификатор локатора.

df1 = pd.DataFrame({'locationid':[111, np.nan, 145, np.nan, 189,np.nan, 158, 145],
                     'geo_loc':['G12','K11','B16','G12','B22','B16', 'K11',he l 'B16']})
df

enter image description here

Мне нужен конечный результат, подобный этому:

enter image description here

индекс 1 locationid отсутствует, и соответствующее значение geo_lo c равно 'K11'. Я бы посмотрел этот 'K11' в столбце geo_lo c, а индекс 6 имеет locationid 158. Этим значением я хочу заполнить пропущенное значение в индексе 1.

Я пробовал эти коды, и они не работали.

df1['locationid'] = df1.locationid.fillna(df1.groupby('geo_loc')['locationid'].max())
df1['locationid'] = df1.locationid.fillna(df1.groupby('geo_loc').apply(lambda x: print(list(x.locationid)[0])))

1 Ответ

2 голосов
/ 22 февраля 2020

Используйте GroupBy.transform для серий с таким же размером, как у оригинала, заполненного агрегированными значениями max:

df1['locationid']=df1.locationid.fillna(df1.groupby('geo_loc')['locationid'].transform('max'))
print (df1)
   locationid geo_loc
0       111.0     G12
1       158.0     K11
2       145.0     B16
3       111.0     G12
4       189.0     B22
5       145.0     B16
6       158.0     K11
7       145.0     B16

Если значения являются строками, это возможно с помощью трюка - удалите пропущенные значения при Series.dropna в лямбда-функции строки сравниваются лексикографически:

df1 = pd.DataFrame({'locationid':[111, np.nan, 145, np.nan, 189,np.nan, 158, 145],
                     'geo_loc':['G12','K11','B16','G12','B22','B16', 'K11', 'B16']})

#sample data strings with missing values
df1['locationid'] = df1['locationid'].dropna().astype(str) + 'a'


df1['locationid']= (df1.groupby('geo_loc')['locationid']
                       .transform(lambda x: x.fillna(x.dropna().max())))

print (df1)
  locationid geo_loc
0     111.0a     G12
1     158.0a     K11
2     145.0a     B16
3     111.0a     G12
4     189.0a     B22
5     145.0a     B16
6     158.0a     K11
7     145.0a     B16
...