Python Pandas在单个单元格中进行计算

时间:2019-02-26 20:38:25

标签: python python-3.x pandas loops

我有一个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。

3 个答案:

答案 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