Мне нужно знать, как добавить данные из одного кадра данных в другой, который был ранее объединен. Причина, по которой я не могу добавить все это одновременно, заключается в том, что это используется в модели 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])
РЕДАКТИРОВАТЬ: я нашел способ сделать это слиянием. Но есть ли здесь ускорение? Мне нужно, чтобы это было достаточно оптимальным.