Введите значения NaN для левого соединения путем выборки из правой таблицы - PullRequest
0 голосов
/ 11 ноября 2018

Я не могу придумать хороший способ панда для заполнения пропущенных значений NaN для левого объединения путем выборки из правой таблицы.

Например, join_left = left.merge (right, how = "left", left_on= [attr1], right_on = [attr2]) слева и справа

   0  1  2
0  1  1  1
1  2  2  2
2  3  3  3
3  9  9  9
4  1  3  2

   0  1  2
0  1  2  2
1  1  2  3
2  3  2  2
3  3  2  9
4  3  2  2

производит что-то вроде

   0  1_x  2_x  1_y  2_y
0  1    1    1  2.0  2.0
1  1    1    1  2.0  3.0
2  2    2    2  NaN  NaN
3  3    3    3  2.0  2.0
4  3    3    3  2.0  9.0
5  3    3    3  2.0  2.0
6  9    9    9  NaN  NaN
7  1    3    2  2.0  2.0
8  1    3    2  2.0  3.0

Как мне выбрать строку из правой таблицы вместо заполнения NaN?

Это то, что я пробовал до сих пор детская площадка :

left = [[1,1,1], [2,2,2],[3,3,3], [9,9,9], [1,3,2]]
right = [[1,2,2],[1,2,3],[3,2,2], [3,2,9], [3,2,2]]
left = np.asarray(left)
right = np.asarray(right)
left = pd.DataFrame(left)
right = pd.DataFrame(right)
joined_left = left.merge(right, how="left", left_on=[0], right_on=[0])

while(joined_left.isnull().values.any()):
    right_sample = right.sample().drop(0, axis=1)
    joined_left.fillna(value=right_sample, limit=1)

print joined_left

В основном, случайная выборка и использование fillna () для первого вхождения значения NaN для заполнения ...но по какой-то причине у меня нет вывода.

Спасибо!

Один из выходов может быть

   0  1_x  2_x  1_y  2_y
0  1    1    1  2.0  2.0
1  1    1    1  2.0  3.0
2  2    2    2  2.0  2.0
3  3    3    3  2.0  2.0
4  3    3    3  2.0  9.0
5  3    3    3  2.0  2.0
6  9    9    9  3.0  2.9
7  1    3    2  2.0  2.0
8  1    3    2  2.0  3.0

с выборкой 3 2 2 и 3 2 9

1 Ответ

0 голосов
/ 11 ноября 2018

Использование sample с fillna

joined_left = left.merge(right, how="left", left_on=[0], right_on=[0],indicator=True) # adding indicator
joined_left
Out[705]: 
   0  1_x  2_x  1_y  2_y     _merge
0  1    1    1  2.0  2.0       both
1  1    1    1  2.0  3.0       both
2  2    2    2  NaN  NaN  left_only
3  3    3    3  2.0  2.0       both
4  3    3    3  2.0  9.0       both
5  3    3    3  2.0  2.0       both
6  9    9    9  NaN  NaN  left_only
7  1    3    2  2.0  2.0       both
8  1    3    2  2.0  3.0       both
nnull=joined_left['_merge'].eq('left_only').sum() # find all many row miss match , at the mergedf
s=right.sample(nnull)# rasmple from the dataframe after dropna 
s.index=joined_left.index[joined_left['_merge'].eq('left_only')] # reset the index of the subset fill df to the index of null value show up 
joined_left.fillna(s.rename(columns={1:'1_y',2:'2_y'})) 
Out[706]: 
   0  1_x  2_x  1_y  2_y     _merge
0  1    1    1  2.0  2.0       both
1  1    1    1  2.0  3.0       both
2  2    2    2  2.0  2.0  left_only
3  3    3    3  2.0  2.0       both
4  3    3    3  2.0  9.0       both
5  3    3    3  2.0  2.0       both
6  9    9    9  2.0  3.0  left_only
7  1    3    2  2.0  2.0       both
8  1    3    2  2.0  3.0       both
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...