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

Posted

技术标签:

【中文标题】使用 Pandas 迭代地将列添加到数据框中【英文标题】:Using Pandas to Iteratively Add Columns to a Dataframe 【发布时间】:2015-08-28 22:47:23 【问题描述】:

我有一些相对简单的代码,我正在努力拼凑起来。我有一个已读入数据框的 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 上执行函数),然后根据函数创建新列执行(例如,输出 6 和输出 7)。上面的代码返回 Column7 的输出,但我不知道如何创建一个变量,让我可以捕获两列的输出(即,一个未被循环覆盖的新变量)。我搜索了 *** 并没有看到任何与我的问题直接相关的内容(可能是因为我太菜鸟了?)。非常感谢您的帮助。

谢谢,

TT

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

【问题讨论】:

你能举例说明你的输入和期望的输出吗?您所说的“新变量”实际上是指“新列名”吗? 是的——一个新的列名。我的输入是一段文字。该函数根据输入文本计算可读性统计信息。因此,新变量(或新列)基本上是基于文本的可读性统计(Flesch-Kincaid 分数)。 for row in rows[6:] 令人困惑,因为rows 是数据集的单行,而for row in rows[6:] 实际上是在迭代列。 【参考方案1】:

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

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

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

【讨论】:

谢谢!我尝试了这种方法并收到以下错误: TypeError: ('expected string or buffer', u'occurred at index CaseNum') 我相信这是因为我的函数被编写为处理单个字符串(向下迭代一列)而不是应用它整行。 等等,这两个函数是应用于单个字符串而不是整行,还是只是perform_function1?也许包含你的函数会有所帮助(如果它们不是太复杂的话)。 函数有点复杂。它们旨在应用于单个字符串。 @TaterTots 他们返回什么? perform_function1 是返回单个值还是多个值? perform_function2 怎么样? 这两个函数都返回单个值。这个问题的答案非常简单。我只需要通过添加一个计数器并在第二个 for 循环中添加以下代码来创建一个动态变量名称:name = df.columns[i+6]df.ix[index, 'new_var' + '_' + str(name)] = perform_function2 感谢您的帮助!【参考方案2】:

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

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

【讨论】:

【参考方案3】:

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 的全部目的。如果您要逐个元素地访问数据框,请考虑改用字典。

【讨论】:

以上是关于使用 Pandas 迭代地将列添加到数据框中的主要内容,如果未能解决你的问题,请参考以下文章

附加列在 pandas DataFrame 中产生 NaN

将列的名称保留在 groupby 中,并在 pandas 数据框中使用 sum

迭代地添加计算列,然后将新数据添加到 Pandas 数据框(python 3.7.1)

迭代 4 个 pandas 数据框列并将它们存储到 4 个列表中,其中一个 for 循环而不是 4 个 for 循环

如何动态地将列添加到 DataFrame?

Python pandas:在我的数据框中添加一个计算变量的列