我正在使用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,我不应该这样使用,请让我知道如何更有效地编写此代码。
请让我知道我的问题投票的原因,以便我可以学习
答案 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)