【问题标题】:Pandas dataframe max in a group based on conditions on other columns基于其他列条件的组中的 Pandas 数据帧最大值
【发布时间】:2014-12-04 16:01:36
【问题描述】:

我不确定以前是否有人问过这个问题。在熊猫数据框中,我有类似的数据

    A    B    C

1   z    0    0
2   z    1    1
3   z    2    2
4   y    0    0
5   y    1    1
6   z    2    2.5
7   z    0    0
8   z    1    0.2
9   z    2    0.8

我想得到

    A    B    C

1   z    2    2.5
2   y    1    1
3   z    2    0.8

在上面的例子中(来自第一个表)z 分别从 B 和 C 的 0 变为 B 的 2 和 C 的 2.5,然后 B 和 C 变为 0。一个重要的属性是 B 和 C 可以不同,但​​是它们将同时变为 0。把它想象成一个计数器,当设备关闭时,所有的计数器都会回到 0。上面例子中的设备是 y 和 z。

此外,从第一个表中,您还可以看到 B 和 C 的 y 分别从 0 变为 1,但它们从未回到 0,但我仍然需要 B 和 C 的最大值,即 1 和 1。

我可以编写一些 python 代码来循环并进行必要的转换,但我想知道这是否可以通过一些 pandas 魔法来实现。

【问题讨论】:

    标签: python pandas dataframe max pandas-groupby


    【解决方案1】:

    这是一种一直使用矢量化方法的方法,应该很快。

    当计数器“重置”时,添加一个值为 1 的列,方法是检查 B 和 C 都为 0 的位置。

    df['new_sample'] = (df[['B','C']] == 0).any(1).astype(int)
    

    然后,按设备类型分组,并使用new_sample 列的累积和,创建一个计数器,每行代表每个设备的试验。

    df['sample'] = df.groupby('A')['new_sample'].cumsum()
    

    最后可以按设备和样本数分组,取最大值。

    In [85]: df.groupby(['A', 'sample'], as_index=False)[['B','C']].max()
    Out[85]: 
       A  sample  B    C
    0  y       1  1  1.0
    1  z       1  2  2.5
    2  z       2  2  0.8
    

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 1970-01-01
      • 2018-09-26
      • 2017-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多