2015-07-08 4 views
5

Я пытаюсь преобразовать dataframe, которое я не могу решить. Я попробовал несколько подходов из stackoverflow и документации pandas: apply, apply (lambda: ...), pivots и join. Слишком много попыток перечислить здесь, но не уверен, какой подход лучше всего, или, может быть, я попробовал правильный подход с неправильным синтаксисом.Python - Pandas - Dataframe: Условное условное смещение столбца

В принципе, у меня есть dataframe, и мне нужно 1) смещать столбцы, 2) количество столбцов, подлежащих смещению, изменяется и зависит от переменной в фреймворке данных, 3) создает столбцы в конце фрейма данных где необходимо, чтобы разместить смещение, и 4) размещать нули за вновь созданные интервалы.

df1 = pd.DataFrame({'first' : ['John', 'Mary', 'Larry', 'jerry'], '1' : [5.5, 6.0,10,20], '2' : [100, 200, 300, 400], '3' : [150, 100, 240, 110], 'offset' : ([1,0,2,1])}) 
goal_df = pd.DataFrame({'first' : ['John', 'Mary', 'Larry', 'jerry'], '1' : [0.0, 6.0, 0.0, 0], '2' : [5.5, 200, 0.0, 20], '3' : [100, 100, 10, 400], '4' : [150, 0.0, 300, 110], '5' : [0.0, 0.0, 240, 0.0]}) 

df1 
1   2  3 first  offset 
5.5  100  150 John  1 
6.0  200  100 Mary  0 
10.0  300  240 Larry  2 
20.0  400  110 jerry  1 


goal_df 
1  2 3 4 5 first 
0 5.5 100 150 0 John 
6 200.0 100 0 0 Mary 
0 0.0 10 300 240 Larry 
0 20.0 400 110 0 jerry 

Этот набор данных будет иметь c. 500 строк и c. 120 столбцов. Сумма смещения будет очень близка к 0-12. Я думал об этом с базовыми функциями Python, но я также обнаружил, что сложный и временный потребитель программы будет побеждать в конечной цели, которая заключается в том, чтобы удалить некоторые задачи, выполняемые в Microsoft Excel.

Я очень жалуюсь на то, как Excel уступает таким крупным задачам, но кажется, что текущая функция offset() таблицы Excel в excel делает это очень простым способом, но с тысячами формул, очень медленно. Я продал свое рабочее место на преимуществах Python над Excel, и это мое первое настоящее испытание, поэтому скорость очень важна для меня, потому что я пытаюсь убедить своих коллег, что Python может сожрать эту таблицу намного быстрее, чем текущая предел файл весом в размере 96 МБ.

Я пришел довольно близко к функции расплава(), а затем взял прежние номера столбцов и добавил смещение к ним. Тем не менее, у меня было много проблем, пытающихся реформировать dataframe с помощью шарнира. Нет удачи в применении или применении (лямбда)!

Спасибо за любую помощь, которую любой может дать!

ответ

3

Это не особенно элегантно или лаконично, но должно делать трюк. Мне немного легче перемешать столбцы в numpy (также должно быть немного быстрее), поэтому я сначала конвертирую из массива данных в массив.

arr = df1.values[:,:-2] # just the numbers 
offset = df1.values[:,-1]  # just the offsets 
column_pad = 2 
arr2 = np.zeros((arr.shape[0],arr.shape[1]+column_pad)) 

Вот код ключа, который просто сдвигает каждую строку на величину смещения.

for i, j in enumerate(offset): 
    arr2[i,j:3+j] = arr[i] 

array([[ 0. , 5.5, 100. , 150. , 0. ], 
     [ 6. , 200. , 100. , 0. , 0. ], 
     [ 0. , 0. , 10. , 300. , 240. ], 
     [ 0. , 20. , 400. , 110. , 0. ]]) 

Помимо этого, это просто небольшой ручный труд, чтобы добавить пространство для колонок и поставить их в правильном порядке.

df2 = df1.copy() 
last_column = 6 
for i in map(str,range(3,last_column)): 
    df2[i] = 0 
df2 = df2[ map(str,range(1,last_column))+['first','offset']] 

Затем загрузить arr2 в df2.

df2.loc[:,'1':'5'] = arr2 

    1  2 3 4 5 first offset 
0 0 5.5 100 150 0 John  1 
1 6 200.0 100 0 0 Mary  0 
2 0 0.0 10 300 240 Larry  2 
3 0 20.0 400 110 0 jerry  1 
+0

Спасибо, что посмотрели. Я пытаюсь решить ваше решение, поэтому, по крайней мере, у меня есть что-то, что работает. Тем временем я попытаюсь разработать этот один путь для плавления данных и изменения номеров столбцов (старый номер столбца + смещение). Единственная проблема заключается в том, что, когда я перехожу к «нерасплавленному» файловому кадру, стержень полностью разрушает все. – nordicray

+0

@nordicray OK, если вы предпочитаете путь расплава/поворота, вы можете опубликовать то, что вы пробовали, и посмотреть, сможет ли кто-нибудь исправить или улучшить его. – JohnE

+0

Спасибо @JohnE. Причина, по которой я не публиковал это, состоит в том, что каждый раз, когда я думал, что я близок, я пойму, как далеко я был на самом деле. Я думаю, что мне нужно сделать еще несколько исследований и на самом деле поставить пальцем на то, как работает многоиндексирование для фреймов данных в Pandas, прежде чем попробовать более оптимизированную версию этого. Я также считаю, что помощь в некоторых других областях, над которыми я работаю. – nordicray

Смежные вопросы