2015-06-12 2 views
3

У меня есть относительно простой код, который я пытаюсь собрать вместе. У меня есть CSV, который я прочитал в dataframe. CSV - это данные панели (т. Е. Уникальные наблюдения за компанией и годом для каждой строки). У меня есть два столбца, в которых я хочу выполнить функцию, а затем я хочу создать новые переменные на основе вывода функции.Использование Pandas для итеративного добавления столбцов в Dataframe

Вот то, что я до сих пор с кодом:

#Loop through rows in a CSV file 
for index, rows in df.iterrows(): 
    #Start at column 6 and go to the end of the file 
    for row in rows[6:]: 
     data = perform_function1(row) 
     output = perform_function2(data)  
     df.ix[index, 'new_variable'] = output 
     print output 

Я хочу этот код для итерации, начиная в колонке 6, а затем собирается в конце файла (например, у меня есть две колонки я хочу, чтобы выполнить функции на столбце 6 и столбце7), а затем создать новые столбцы на основе выполняемых функций (например, Output6 и Output7). Приведенный выше код возвращает результат для столбца7, но я не могу понять, как создать переменную, которая позволяет мне записывать выходы из обоих столбцов (т. Е. Новую переменную, которая не перезаписывается циклом). Я искал Stackoverflow и не видел ничего, что непосредственно связано с моим вопросом (может быть, потому, что я слишком большой noob?). Я бы очень признателен вам за вашу помощь.

Спасибо,

TT

P.S. Я не уверен, предоставил ли я достаточно подробностей. Пожалуйста, дайте мне знать, если мне нужно предоставить больше.

+0

Можете ли вы привести пример ввода и желаемого вывода? Под «новой переменной» вы действительно имеете в виду «новое имя столбца»? – BrenBarn

+0

Да - новое имя столбца. Мой ввод - это абзац текста.Функция вычисляет статистику читаемости на основе входного текста. Таким образом, новая переменная (или новый столбец) будет в основном состоять из статистики чтения (Flesch-Kincaid Score) на основе текста. – TaterTots

+0

'для строки в строках [6:]' запутан, потому что 'rows' - ​​это одна строка набора данных, а' для строки в строках [6:] 'выполняет итерацию столбцов на самом деле. – GeauxEric

ответ

4

Операция итеративно не использует возможности Pandas. Сила Pandas заключается в эффективном применении операций по всему кадру данных, а не по итерации подряд за строкой. Это отлично подходит для такой задачи, когда вы хотите связать несколько функций по вашим данным. Вы должны выполнить всю свою задачу в одной строке.

df["new_variable"] = df.ix[6:].apply(perform_function1).apply(perform_function2) 

perform_function1 будет применен к каждой строке, и perform_function2 будет применен к результатам первой функции.

+0

Спасибо! Я пробовал этот подход и получил следующую ошибку: TypeError: ('ожидаемая строка или буфер', u'occurred по индексу CaseNum ') Я считаю, что это потому, что мои функции были написаны для обработки отдельных строк (итерации по столбцу) а не применять его к целой строке. – TaterTots

+0

Подождите, обе функции предназначены для применения к отдельным строкам вместо целой строки или просто 'perform_function1'? Возможно, это поможет включить ваши функции (если они не слишком сложны). – ASGM

+0

Функции сложны. Они предназначены для применения к отдельным строкам. – TaterTots

0

Если вы хотите применить функцию к определенным колонкам в dataframe

# Get the Series 
colmun6 = df.ix[:, 5] 
# perform_function1 applied to each row 
output6 = column6.apply(perform_function1) 
df["new_variable"] = output6 
0

панды довольно инерционная строка за строкой: вы гораздо лучше использовать append, concat, merge, или join функциональности на всей информационной структуре.

Чтобы дать некоторое представление, почему, давайте рассмотрим случайный DataFrame пример:

import numpy as np 
import pandas as pd 
dates = pd.date_range('20130101', periods=6) 
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD')) 
df2 = df.copy() 
# operation to concatenate two dataframes 
%timeit pd.concat([df2, df]) 
1000 loops, best of 3: 737 µs per loop 
%timeit df.loc['2013-01-01'] 
1000 loops, best of 3: 251 µs per loop 
# single element operation 
%timeit df.loc['2013-01-01', 'A'] = 3 
1000 loops, best of 3: 218 µs per loop 

Обратите внимание, как эффективно Панды обрабатывает целые операции dataFrame, и как неэффективное он обрабатывает операции на отдельные элементы?

Если мы расширим это, та же тенденция имеет место, только гораздо более выраженные:

df = pd.DataFrame(np.random.randn(200, 300)) 
# single element operation 
%timeit df.loc[1,1] = 3 
10000 loops, best of 3: 74.6 µs per loop 
df2 = df.copy() 
# full dataframe operation 
%timeit pd.concat([df2, df]) 
1000 loops, best of 3: 830 µs per loop 

Панда выполняет операцию в целом, 200x300 DataFrame около 6000 раз быстрее, чем это делает для операции на одном элемент. Короче говоря, итерация убьет всю цель использования Панд. Если вы используете элемент данных по элементу, используйте вместо него словарь.

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