我对Python很新,并试图提高我对列表推导的理解。
我想将下面的for循环转换为列表理解。我的努力失败,出现了一条我无法破译的错误消息:
IndexError: ('index 17 is out of bounds for axis 1 with size 3', 'occurred at index 0')
代码:
# 1: Original Code With For Loop (Working)
import pandas as pd
import numpy as np
A = pd.DataFrame([2,20], index=['b','a'])
B = pd.DataFrame([3,4,5], index=['a','b','c'])
C= A-B
print(C)
for x in range(3):
if ~np.isnan(C.iloc[x][0]):
C.iloc[x] = C.iloc[x][0]
else:
C.iloc[x] = B.iloc[x][0]
print(C)
# 2: New Code Incorporating List Comprehension (Not Working)
A = pd.DataFrame([2,20], index=['b','a'])
B = pd.DataFrame([3,4,5], index=['a','b','c'])
C= A-B
print(C)
C.apply(lambda x: C.iloc[x][0] if ~np.isnan(C.iloc[x][0]) else B.iloc[x][0])
答案 0 :(得分:3)
这就是你想要的吗?
In [177]: A.sub(B).fillna(B)
Out[177]:
0
a 17.0
b -2.0
c 5.0
或者这个:
In [178]: A.sub(B, fill_value=0)
Out[178]:
0
a 17.0
b -2.0
c -5.0
另一个熊猫解决方案:
In [193]: C
Out[193]:
0
a 17.0
b -2.0
c NaN
In [194]: C.where(C.notnull(), B)
Out[194]:
0
a 17.0
b -2.0
c 5.0
答案 1 :(得分:2)
for x in range(3):
if ~np.isnan(C.iloc[x][0]):
C.iloc[x] = C.iloc[x][0]
else:
C.iloc[x] = B.iloc[x][0]
列表理解将是
[C.iloc[x][0] if ~np.isnan(C.iloc[x][0]) else B.iloc[x][0]
for x in range(3) ]
然后,您需要将结果列表分配给适当的变量。我无法做到这一点,因为您没有包含足够的代码来测试您的上下文中的结果。
然而,如前面的答案所示,这可能不是实现这一特定结果的最佳方式。