Iterrows表现

时间:2016-09-09 19:10:08

标签: python-2.7 pandas

我正在使用python 2.7,pandas(版本0.18.1)数据帧。 我必须根据同一数据框中的几个列修改数据框中的列。

为此,我编写了如下代码 示例数据如下所示

$是我的数据框

我的样本数据就像

data

我的代码如下所示

+---+---+----+----+---+---------+---+----+----+---+----------+
| a | b | c  | d  | e |    f    | g | h  | i  | j | discount |
+---+---+----+----+---+---------+---+----+----+---+----------+
| 0 |   |    |    |   | 65497.6 |   |    |    |   |        0 |
| 0 |   |    |    |   | 73882.8 |   |    |    |   |        0 |
| 0 |   |    |    |   | 88588   |   | 22 |    |   |        0 |
| 0 |   |    |    |   | 106480  |   | 20 | 10 |   |        0 |
| 0 |   |    |    |   | 52500   |   |    |    |   |        0 |
| 0 |   | 20 | 10 |   | 22997.5 |   |    |    |   |        0 |
|   |   |    |    |   |         |   |    |    |   |        0 |
| 0 |   |    | 20 |   | 0       |   |    |    |   |        0 |
| 0 |   |    |    |   | 10520   |   |    |    |   |        0 |
+---+---+----+----+---+---------+---+----+----+---+----------+

由于我这样做,因此在大型数据集上花费了大量时间和大量内存。我有700MB的数据,需要超过120GB的RAM才能处理,大约10小时后,流程正在提供例外columns1 = ['a','b','c','d','e'] columns2 = ['f','g','h','i','j'] data['discount'] = 0 for i, row in data.iterrows(): a = 0 b = 0 for col1 in columns1 : value = row[col1] if value > 0: a = value break; for col2 in columns2 : value = row[col2] if value > 0: b = value break; if( a != 0 and b != 0): data.loc[i, 'discount'] = abs(a-b)

根据这个https://stackoverflow.com/a/24871316,我不应该这样使用,请让我知道如何更有效地编写此代码。

请让我知道我的问题投票的原因,以便我可以学习

1 个答案:

答案 0 :(得分:0)

假设您的空单元格为NaN值,则为您提供您感兴趣的列组的每一行的第一个非NA值:

df[df>0][columns1].bfill(axis=1).iloc[:,0]

0     NaN
1     NaN
2     NaN
3     NaN
4     NaN
5    20.0
6     NaN
7    20.0
8     NaN

因此,这会为您提供abs(a-b)您正在搜索的内容:

res = (df[df>0][columns1].bfill(axis=1).iloc[:,0]
      -df[df>0][columns2].bfill(axis=1).iloc[:,0]).abs()
res

0        NaN
1        NaN
2        NaN
3        NaN
4        NaN
5    22977.5
6        NaN
7        NaN
8        NaN

您可以将其与初始化的discount列结合使用:

res.combine_first(df.discount)

或填补空白:

res.fillna(0)