我有一些相对简单的代码,我很难拼凑起来。我有一个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。我不确定我是否提供了足够的细节。如果我需要提供更多信息,请告诉我。
答案 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逐行行动很慢:你最好总体上使用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
请注意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的全部目的。如果您逐个元素地访问数据框,请考虑使用字典。