【问题标题】:Python Pandas make calculation in single cellPython Pandas 在单个单元格中进行计算
【发布时间】:2019-07-20 11:31:48
【问题描述】:

我有一个 TYPE 列 和一个 VOLUME 列 如果首先检查 TYPE column == '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。

【问题讨论】:

标签: python python-3.x pandas loops


【解决方案1】:

考虑一个简单的例子来演示正在发生的事情。

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】:

您可以将*= 与 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

【讨论】:

    【解决方案3】:

    你真的很亲密。问题在于您如何存储结果。这应该有效:

     data.loc[data['TYPE'] == 'var1', ['VOLUME']] = data['VOLUME'] * 2
    

    【讨论】:

    • 您将计算整个列的乘法,然后继续丢弃您不需要的条目。不错,但没有达到应有的水平(查看其他答案)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 2017-05-04
    • 1970-01-01
    • 1970-01-01
    • 2016-03-22
    相关资源
    最近更新 更多