Как добавить данные в DataFrame из другого DataFrame с другим индексом - PullRequest
0 голосов
/ 13 апреля 2020

Мне нужно знать, как добавить данные из одного кадра данных в другой, который был ранее объединен. Причина, по которой я не могу добавить все это одновременно, заключается в том, что это используется в модели PyQT Table, и я разрешаю пользователю извлекать только те данные, которые они хотят, заранее. Однако, поскольку они делают больше анализа, им может понадобиться добавить больше данных. Я отслеживаю, откуда поступают данные, с помощью столбца fpath, который я добавляю. Я также сохраняю собственные заголовки данных, чтобы пользователь мог выбрать, какой из них он хочет добавить.

Моя проблема в том, что похоже, что это должно работать, однако вместо значений я получаю NaN. Я использовал здесь алфавит, потому что это должно быть одной и той же буквой в столбцах «это» и «это» для последних 26 знаков, если все сделано правильно.

Что я пробовал:

import numpy as np
import pandas as pd
import string

alphabet = list(string.ascii_lowercase)

d = {'this':alphabet,'that':alphabet,'fpath':['d']*len(alphabet)}
j = {'this':alphabet,'fpath':['j']*len(alphabet)}

y1 = pd.DataFrame(d)
y2 = pd.DataFrame(j)
#subset of y1
y3 = y1[['that','fpath']]

#Must be done with ignore_index = True for the purposes of my needs
hh = pd.concat([y2,y3],axis=0,ignore_index=True)
#scramble the data a little bit
hh.sort_values('this',ascending=False,inplace=True)

#Imagine now that y1,y2, and y3 are not in memory anymore, but i can still pull data.
#The data is stored in a file, and I know where it comes from.  And which headers
#I need are known.  hh is still in memory at this point

#want to add y1['this'] to hh in the correct indecies
#what I've Tried

#Emulating gathering the data from the file
N = pd.DataFrame(y1['this'])

newdata = pd.DataFrame({'IDX':np.arange(hh.shape[0])})
idx = hh['fpath']=='d'
p = newdata[idx]
p = p.reset_index(drop=True)
p.sort_values('IDX',inplace=True)
p = pd.concat([p,N],axis=1)
p = p.reindex(newdata.index)
#THIS WAS THE ORIGINAL LINE (That did not work)
#newdata.loc[p['IDX']==newdata['IDX'],'this'] = p['this']

#This is the updated lines.
newdata = newdata.merge(p,how='outer')
newdata = newdata[newdata['IDX'].notna()]

headers = list(newdata)
headers.remove('IDX')
for header in headers:
    if header in hh:
        idx = newdata[header].isnull()
        hh.loc[~idx,header] = newdata[~idx][header]
    else:
        hh = hh.join(newdata[header])

РЕДАКТИРОВАТЬ: я нашел способ сделать это слиянием. Но есть ли здесь ускорение? Мне нужно, чтобы это было достаточно оптимальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...