我想将两个独立的列相乘,直到它们的乘积大于x。
d = {
'name': ['A','B','C','D','E'],
'i1': [1,2,3,5,1],
'i2': [2,2,2,6,8],
'result': [2,4,6,30,8]
}
df = pd.DataFrame(d)
name i1 i2 result
0 A 1 2 2
1 B 2 2 4
2 C 3 2 6
3 D 5 6 30
4 E 1 8 8
我希望循环重复,只要结果小于x。
for _index, row in df.iterrows():
while row['result'] < 10:
row['i1'] = row['i1'] * 2
row['i2'] = row['i2'] * 2
row['result'] = row['i1'] * row['i2']
else:
pass
我没有收到任何错误,但df保持不变。你能告诉我我做错了什么吗?解决这个问题的最佳方法是什么?
第一个解决方案
for index, row in df.iterrows():
while df.loc[index, 'result'] < 10:
df.loc[index, 'i1'] = df.loc[index, 'i1'] * 2
df.loc[index, 'i2'] = df.loc[index, 'i2'] * 2
df.loc[index, 'result'] = df.loc[index, 'i1'] * df.loc[index, 'i2']
else:
pass
name i1 i2 result
0 A 4 8 32
1 B 4 4 16
2 C 6 4 24
3 D 5 6 30
4 E 2 16 32
新问题
朝着我的目标前进的步伐太大了。一个更好的解决方案可能是每行存储原始值,并将它们与循环中的当前值相加(我需要它们保持整数(。这就是我尝试的:
for index, row in df.iterrows():
i1 = df.loc[index, 'i1']
i2 = df.loc[index, 'i2']
while df.loc[index, 'result'] < 10:
df.loc[index, 'i1'] = df.loc[index, 'i1'] + i1
df.loc[index, 'i2'] = df.loc[index, 'i2'] + i2
df.loc[index, 'result'] = df.loc[index, 'i1'] * df.loc[index, 'i2']
else:
pass
但运行循环永远不会结束,我必须用CTRL-C来打破它。
我不确定是要将i1
和i2
的值加倍还是只将结果加倍。
如果您只想将结果增加四倍,则此解决方案适用于这种情况。
def quadruple_till_bt_10(x):
if x <= 0:
return pd.NA
while(x<10):
x *= 4
return x
df = df.assign(result=df.i1*df.i2)
df.result = df.result.apply(quadruple_till_bt_10)
当乘积为0或负数时,它返回NA
,而不是陷入无限循环。