Эффективно дублировать строки данных в соответствии с другой таблицей - PullRequest
0 голосов
/ 23 мая 2018

Мне нужно добавить измененные копии своих собственных строк в фрейм данных в соответствии с отдельной таблицей, но он должен работать на миллионах строк, и у меня возникают проблемы при его оптимизации.

У меня есть фрейм данных dfгде один идентификатор - это определенный столбец 'myIndex'

    df=pd.DataFrame([
                 {'myIndex':1,'dummyData':2,'type':'test'},
                 {'myIndex':1,'dummyData':3,'type':'test'},
                 {'myIndex':1,'dummyData':4,'type':'other'},
                 {'myIndex':2,'dummyData':22,'type':'test'},
                 {'myIndex':2,'dummyData':32,'type':'test'},
                 {'myIndex':2,'dummyData':42,'type':'other'},
                 {'myIndex':3,'dummyData':23,'type':'test'},
                 {'myIndex':3,'dummyData':33,'type':'test'},
                 {'myIndex':3,'dummyData':43,'type':'other'}
                 ])

Я должен продублировать его строки в соответствии с таблицей в другом фрейме данных

    repeatedRows=pd.DataFrame([
                           {'myIndex':1,'idx2':21},
                           {'myIndex':1,'idx2':31},
                           {'myIndex':1,'idx2':42},
                           {'myIndex':2,'idx2':221},
                           {'myIndex':2,'idx2':231},
                           {'myIndex':2,'idx2':242},
                           {'myIndex':3,'idx2':321},
                           {'myIndex':3,'idx2':331},
                           {'myIndex':4,'idx2':342}
                           ])

Таким образом, строка df, myIndex которой появляется в repeatRowsдолжно быть реплицировано с «myIndex» заменено на idx2, а «type» заменено на «duplicate».Это моя последняя попытка:

import pandas as pd
pd.options.mode.chained_assignment = None # Avoid annoying warning
def Test1(df,repeatedRows):
    for idx in set(repeatedRows['myIndex']):
        vals=df[df['myIndex']==idx]
        for n in repeatedRows[repeatedRows['myIndex']==idx].loc[:,'idx2']:
            vals.loc[:,'myIndex']=n
            vals.loc[:,'type']='duplicate'
            df=pd.concat([df,vals],ignore_index=True)
    return df

Это ожидаемый результат:

untitled0.Test1()
Out[44]: 
    dummyData  myIndex       type
0           2        1       test
1           3        1       test
2           4        1      other
3          22        2       test
4          32        2       test
5          42        2      other
6          23        3       test
7          33        3       test
8          43        3      other
9           2       21  duplicate
10          3       21  duplicate
11          4       21  duplicate
12          2       31  duplicate
13          3       31  duplicate
14          4       31  duplicate
15          2       42  duplicate
16          3       42  duplicate
17          4       42  duplicate
18         22      221  duplicate
19         32      221  duplicate
20         42      221  duplicate
21         22      231  duplicate
22         32      231  duplicate
23         42      231  duplicate
24         22      242  duplicate
25         32      242  duplicate
26         42      242  duplicate
27         23      321  duplicate
28         33      321  duplicate
29         43      321  duplicate
30         23      331  duplicate
31         33      331  duplicate
32         43      331  duplicate

Я реализовал это несколькими различными способами, но это все еще занимает много времени, я думаю,Я делаю что-то очень неэффективное, или не в полной мере пользуюсь пандами.Любой совет будет высоко ценится.

1 Ответ

0 голосов
/ 23 мая 2018

Вам необходимо объединить оба фрейма данных, внести изменения и объединить их обратно в df:

mer = df.merge(repeatedRows, how='left')
mer['myIndex'] = mer['idx2']
mer['type'] = 'duplicate'
df = pd.concat([df, mer.drop(['idx2'], axis=1)], ignore_index=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...