【问题标题】:Pandas dataframe max and min value熊猫数据框最大值和最小值
【发布时间】:2017-07-25 13:24:15
【问题描述】:

我有一个如下所示的 pandas 数据框:

+-----+---+---+--+--+
|     | A | B |  |  |
+-----+---+---+--+--+
| 288 | 1 | 4 |  |  |
+-----+---+---+--+--+
| 245 | 2 | 3 |  |  |
+-----+---+---+--+--+
| 543 | 3 | 6 |  |  |
+-----+---+---+--+--+
| 867 | 1 | 9 |  |  |
+-----+---+---+--+--+
| 345 | 2 | 7 |  |  |
+-----+---+---+--+--+
| 122 | 3 | 8 |  |  |
+-----+---+---+--+--+
| 233 | 1 | 1 |  |  |
+-----+---+---+--+--+
| 346 | 2 | 6 |  |  |
+-----+---+---+--+--+
| 765 | 3 | 3 |  |  |
+-----+---+---+--+--+

我想要做的是从“A”列中从 1 到 3 的范围给出的“B”列中获取最大值和最小值

例如:

loop on A in range 1 to 3:
       get max and min values from column 'B'
       max = 6
       min = 3
loop on the next range of A from 1 to 3:
       get max and min values from column 'B'
       max = 9
       min = 7           
loop on the next range of A from 1 to 3:
       get max and min values from column 'B'
       max = 6
       min = 1

并将最小最大值添加到如下列中:

+-----+---+---+--+----+
|     | A | B |min|max|
+-----+---+---+--+----+
| 288 | 1 | 4 | 3 | 6 |
+-----+---+---+--+----+
| 245 | 2 | 3 |   |   |
+-----+---+---+--+----+
| 543 | 3 | 6 |   |   |
+-----+---+---+--+----+
| 867 | 1 | 9 | 7 | 9 |
+-----+---+---+--+----+
| 345 | 2 | 7 |   |   |
+-----+---+---+--+----+
| 122 | 3 | 8 |   |   |
+-----+---+---+--+----+
| 233 | 1 | 1 | 1 | 6 |
+-----+---+---+--+----+
| 346 | 2 | 6 |   |   |
+-----+---+---+--+----+
| 765 | 3 | 3 |   |   |
+-----+---+---+--+----+

【问题讨论】:

    标签: python pandas jupyter-notebook


    【解决方案1】:

    如果不需要空值:

    g = df.groupby(np.arange(len(df.index)) // 3)
    df['min'] = g.B.transform('min')
    df['max'] = g.B.transform('max')
    print (df)
         A  B  min  max
    288  1  4    3    6
    245  2  3    3    6
    543  3  6    3    6
    867  1  9    7    9
    345  2  7    7    9
    122  3  8    7    9
    233  1  1    1    6
    346  2  6    1    6
    765  3  3    1    6
    

    对于 emty 值,可以添加空格,但是 minmax 列中的所有值也会转换为字符串:

    g = df.groupby(np.arange(len(df.index)) // 3)
    df['min'] = g.B.transform('min')
    df['max'] = g.B.transform('max')
    df.loc[df.A != 1, ['min','max']] = ''
    print (df)
         A  B min max
    288  1  4   3   6
    245  2  3        
    543  3  6        
    867  1  9   7   9
    345  2  7        
    122  3  8        
    233  1  1   1   6
    346  2  6        
    765  3  3    
    

    编辑1:

    df['range']='range' + pd.Series(np.arange(len(df.index))//3 + 1, index=df.index).astype(str) 
    g = df.groupby('range')
    df['min'] = g.B.transform('min')
    df['max'] = g.B.transform('max')
    print (df)
         A  B   range  min  max
    288  1  4  range1    3    6
    245  2  3  range1    3    6
    543  3  6  range1    3    6
    867  1  9  range2    7    9
    345  2  7  range2    7    9
    122  3  8  range2    7    9
    233  1  1  range3    1    6
    346  2  6  range3    1    6
    765  3  3  range3    1    6
    

    布尔掩码cumsum的另一种解决方案:

    df['range'] = 'range' + (df.A == 1).cumsum().astype(str)
    g = df.groupby('range')
    df['min'] = g.B.transform('min')
    df['max'] = g.B.transform('max')
    print (df)
         A  B   range  min  max
    288  1  4  range1    3    6
    245  2  3  range1    3    6
    543  3  6  range1    3    6
    867  1  9  range2    7    9
    345  2  7  range2    7    9
    122  3  8  range2    7    9
    233  1  1  range3    1    6
    346  2  6  range3    1    6
    765  3  3  range3    1    6
    

    【讨论】:

    • 我不需要空格,但我确实需要区分“A”列上的范围。如何添加另一列可能是“范围”列并输入当前范围的值。对于从 1 到 3 的第一个范围,可能是范围 1,而对于下一个范围,可能是范围 2?
    • 你能检查我的答案吗?我在打电话
    • df['range'] = 'range' + (np.arange(len(df.index)) // 3).astype(str) 然后g = df.groupby('range') 我只是在电话上,所以没有检查。 `
    • 我收到此错误:ufunc 'add' 不包含签名匹配类型 dtype('
    • 试试df['range'] = 'range' + pd.Series(np.arange(len(df.index)) // 3)).astype(str)
    【解决方案2】:

    一般解决方案

    g = df.groupby(df.groupby('A').cumcount())
    df['min'] = g.B.transform('min')
    df['max'] = g.B.transform('max')
    print (df)
         A  B  min  max
    288  1  4    3    6
    245  2  3    3    6
    543  3  6    3    6
    867  1  9    7    9
    345  2  7    7    9
    122  3  8    7    9
    233  1  1    1    6
    346  2  6    1    6
    765  3  3    1    6
    

    【讨论】:

    • 这也有效,但我需要添加另一列来跟踪范围。例如添加列 Range 然后为 A 上的第一个范围从 1 到 3 添加“Range 1”到 Range 列然后为 A 上的下一个范围添加“Range 2”到 Range 列等...
    猜你喜欢
    • 1970-01-01
    • 2020-04-28
    • 2021-06-05
    • 2021-06-23
    • 2018-06-09
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2021-02-08
    相关资源
    最近更新 更多