如果每行的结果小于x,如何将数据帧的两列中的行值相乘



我想将两个独立的列相乘,直到它们的乘积大于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来打破它。

我不确定是要将i1i2的值加倍还是只将结果加倍。

如果您只想将结果增加四倍,则此解决方案适用于这种情况。

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,而不是陷入无限循环。

最新更新