使用Pandas迭代地将列添加到数据帧

时间:2015-06-12 20:02:34

标签: python loops pandas dataframe

我有一些相对简单的代码,我很难拼凑起来。我有一个CSV,我已经读入了数据帧。 CSV是面板数据(即每行的唯一公司和年度观察)。我有两列要执行函数,然后我想根据函数的输出创建新变量。

以下是我目前使用的代码:

#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列开始迭代,然后转到文件的末尾(例如,我有两列我想在Column6和Column7上执行该函数),然后根据函数创建新列进行了(例如,Output6和Output7)。上面的代码返回Column7的输出,但我无法弄清楚如何创建一个允许我捕获两列输出的变量(即,一个不被循环覆盖的新变量)。我搜索了Stackoverflow并没有看到任何与我的问题直接相关的内容(也许是因为我的菜鸟太大了?)。我非常感谢你的帮助。

谢谢,

TT

P.S。我不确定我是否提供了足够的细节。如果我需要提供更多信息,请告诉我。

3 个答案:

答案 0 :(得分:4)

迭代操作不会利用Pandas的功能。 Pandas的优势在于在整个数据框架中有效地应用操作,而不是逐行迭代。对于像这样的任务来说,这非常适合您想要在数据中链接一些函数。您应该能够在一行中完成整个任务。

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

perform_function1将应用于每一行,perform_function2将应用于第一个函数的结果。

答案 1 :(得分:0)

如果要将函数应用于数据框中的某些列

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

答案 2 :(得分:0)

Pandas逐行行动很慢:你最好总体上使用appendconcatmergejoin功能数据帧。

为了解一下原因,让我们考虑一个随机的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

请注意Pandas如何有效地处理整个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

Pandas整体上执行操作,200x300 DataFrame比单个元素上的操作快6,000倍。简而言之,迭代会破坏使用Pandas的全部目的。如果您逐个元素地访问数据框,请考虑使用字典。