【问题标题】:Set maximum value in DataFrame column在 DataFrame 列中设置最大值
【发布时间】:2018-06-01 12:55:53
【问题描述】:

我在熊猫数据框中有以下数据点:

DateTime                Data
2017-11-21 18:54:31     1
2017-11-22 02:26:48     2
2017-11-22 10:19:44     3
2017-11-22 15:11:28     6
2017-11-22 23:21:58     7
2017-11-28 14:28:28    28
2017-11-28 14:36:40     0
2017-11-28 14:59:48     1

我想应用一个函数将所有大于 1 的 Data 值转换为 1: 有没有办法将以下两个 lambda 函数合二为一(如 else 语句)?

[(lambda x: x/x)(x) for x in df['Data'] if x > 0]
[(lambda x: x)(x) for x in df['Data'] if x <1 ]

想要的最终结果:

DateTime                Data
2017-11-21 18:54:31     1
2017-11-22 02:26:48     1
2017-11-22 10:19:44     1
2017-11-22 15:11:28     1
2017-11-22 23:21:58     1
2017-11-28 14:28:28     1
2017-11-28 14:36:40     0
2017-11-28 14:59:48     1

【问题讨论】:

    标签: python pandas numpy dataframe


    【解决方案1】:

    np.clip 的 Numpy 解决方案 -

    df['Data'] = np.clip(df.Data.values, a_min=None, a_max=1)
    df
    
                  DateTime  Data
    0  2017-11-21 18:54:31     1
    1  2017-11-22 02:26:48     1
    2  2017-11-22 10:19:44     1
    3  2017-11-22 15:11:28     1
    4  2017-11-22 23:21:58     1
    5  2017-11-28 14:28:28     1
    6  2017-11-28 14:36:40     0
    7  2017-11-28 14:59:48     1
    

    通过a_min=None 指定无下限。

    【讨论】:

    • 这是一个很好的答案,np 真的很强大,但是,我会选择 Jezrael 作为最佳答案,因为它使用了 datafram 的内部函数。尽管如此,我还是很感激。
    • @user97662 没问题。我可以尊重你的决定。编码愉快。
    • @user97662 虽然我应该提醒您注意,我的答案比 jezrael 最快的答案好 9 倍。看看我的时间安排。如果性能很重要,我建议您重新考虑。
    【解决方案2】:

    你可以使用clip_upper:

    df['Data'] = df['Data'].clip_upper(1)
    

    或者使用ge (&gt;=) 作为布尔掩码并转换为int,如果没有负值:

    df['Data'] = df['Data'].ge(1).astype(int)
    
    print (df)
                  DateTime  Data
    0  2017-11-21 18:54:31     1
    1  2017-11-22 02:26:48     1
    2  2017-11-22 10:19:44     1
    3  2017-11-22 15:11:28     1
    4  2017-11-22 23:21:58     1
    5  2017-11-28 14:28:28     1
    6  2017-11-28 14:36:40     0
    7  2017-11-28 14:59:48     1
    

    但是如果想使用列表理解(在更大的 DataFrame 中应该会更慢):

    df['Data'] = [1 if x > 0 else x for x in df['Data']]
    print (df)
                  DateTime  Data
    0  2017-11-21 18:54:31     1
    1  2017-11-22 02:26:48     1
    2  2017-11-22 10:19:44     1
    3  2017-11-22 15:11:28     1
    4  2017-11-22 23:21:58     1
    5  2017-11-28 14:28:28     1
    6  2017-11-28 14:36:40     0
    7  2017-11-28 14:59:48     1
    

    时间安排

    #[8000 rows x 5 columns]
    df = pd.concat([df]*1000).reset_index(drop=True)
    
    In [28]: %timeit df['Data2'] = df['Data'].clip_upper(1)
    1000 loops, best of 3: 308 µs per loop
    
    In [29]: %timeit df['Data3'] = df['Data'].ge(1).astype(int)
    1000 loops, best of 3: 425 µs per loop
    
    In [30]: %timeit df['Data1'] = [1 if x > 0 else x for x in df['Data']]
    100 loops, best of 3: 3.02 ms per loop
    
    #[800000 rows x 5 columns]
    df = pd.concat([df]*100000).reset_index(drop=True)
    
    In [32]: %timeit df['Data2'] = df['Data'].clip_upper(1)
    100 loops, best of 3: 9.32 ms per loop
    
    In [33]: %timeit df['Data3'] = df['Data'].ge(1).astype(int)
    100 loops, best of 3: 4.76 ms per loop
    
    In [34]: %timeit df['Data1'] = [1 if x > 0 else x for x in df['Data']]
    1 loop, best of 3: 274 ms per loop
    

    【讨论】:

      猜你喜欢
      • 2019-06-05
      • 2020-02-16
      • 2017-07-28
      • 2022-08-03
      • 1970-01-01
      • 2016-09-06
      • 1970-01-01
      相关资源
      最近更新 更多