我有一个TYPE列 和VOLUME列 如果首先检查TYPE列=='var1'
,该怎么办?如果是这样,我想在VOLUME栏中进行计算。
到目前为止,我有这样的事情:
data.loc[data['TYPE'] == 'var1', ['VOLUME']] * 2
data.loc[data['TYPE'] == 'var1', ['VOLUME']] * 4
这似乎将满足条件的整个列设置为最后一个变量。所以我最后只有两个值。
出局:
4
4
4
4
8
8
8
另一个选择:
data['VOLUME'] = data.loc[data['TYPE'] == 'var1', ['VOLUME']] * 2
这在第一种情况下有效,但在第二种情况下显示NaN 然后,当我运行时:
data['VOLUME'] = data.loc[data['TYPE'] == 'var2', ['VOLUME']] * 4
整列显示为NaN。
答案 0 :(得分:2)
您可以将*=
与loc一起使用:
In [11]: df = pd.DataFrame([[1], [2]], columns=["A"])
In [12]: df
Out[12]:
A
0 1
1 2
In [13]: df.loc[df.A == 1, "A"] *= 3
In [14]: df
Out[14]:
A
0 3
1 2
答案 1 :(得分:2)
考虑一个简单的示例,演示正在发生的事情。
df = pd.DataFrame({'A': [1, 2, 3]})
df
A
0 1
1 2
2 3
现在,仅修改“ A”列中小于2的值。因此,尝试类似
df.loc[df.A < 2, 'A'] * 2
0 2
Name: A, dtype: int64
该系列在索引0处只有1行。如果您尝试将其分配回去,则隐含的假设是其他索引值都将重置为NaN。
df.assign(A=df.loc[df.A < 2, 'A'] * 2)
A
0 2.0
1 NaN
2 NaN
我们要做的是仅修改我们感兴趣的行。最好用就地修改算术运算符*=
:
df.loc[df.A < 2, 'A'] *= 2
您的情况是
data.loc[data['TYPE'] == 'var1', 'VOLUME'] *= 2
答案 2 :(得分:1)
您真的很亲近。问题在于您如何存储结果。这应该起作用:
data.loc[data['TYPE'] == 'var1', ['VOLUME']] = data['VOLUME'] * 2