У меня есть большой pandas DF, который занимает почти всю мою оперативную память. Его индекс всегда один из следующих: «c1», «c2», «c3».
0 1 2 ... n
i
c1 1 8 15
c2 2 9 16
c1 3 10 17
c3 4 11 18
c2 5 12 19
c1 6 13 20
c3 7 14 21
...
У меня также есть словарь, в котором ключи «соответствуют» индексным меткам фрейма данных. Значения представляют собой списки / массивы с длиной n (равной количеству столбцов данных).
d = {'c1':[10,10,10,...],'c2':[100,100,100,...],'c3':[1000,1000,1000,...]}
len(d[<allkeys>]) == n >>> True
Я хочу сделать простое умножение данных на основе «атрибута» строки - в этом case это его индекс, но это может быть значение из столбца. Результат будет выглядеть следующим образом:
0 1 2
i
c1 10 80 150
c2 200 900 1600
c1 30 100 170
c3 4000 11000 18000
c2 500 1200 1900
c1 60 130 200
c3 7000 14000 21000
Я не хочу создавать второй DF2 для фрейма данных таким образом, чтобы я мог просто сделать DF * DF2, потому что у меня недостаточно ОЗУ и потому что датафрейм кажется мне бессмысленным, а это означает, что это будет просто повторение массивов / списков (пожалуйста, исправьте меня, если я ошибаюсь).
Я думал о втором кадре данных, подобном этому:
0 1 2
c1 10 10 10
c2 100 100 100
c3 1000 1000 1000
Но когда я делаю DF * DF2, каким-то образом индекс сортируется, и я не знаю, как этого можно избежать. Результат:
0 1 2
c1 100 800 1500
c1 300 1000 1700
c1 600 1300 2000
c2 20000 90000 160000
c2 50000 120000 190000
c3 4000000 11000000 18000000
c3 7000000 14000000 21000000
Если вы считаете, что есть другой способ решения этой проблемы (различные структуры данных, библиотеки и т. Д. c), который также будет полезен.
Код для примеров:
df = pd.DataFrame({0: [1, 2, 3, 4, 5, 6, 7],1: [8, 9, 10, 11, 12, 13, 14], 2: [15, 16, 17, 18, 19, 20, 21]}, index=pd.Index(['c1', 'c2', 'c1', 'c3', 'c2', 'c1', 'c3'], dtype='object', name='i'))
d = {'c1':[10,10,10],'c2':[100,100,100],'c3':[1000,1000,1000]}
df2 = pd.DataFrame.from_dict(d,orient='index')