【问题标题】:Replace a range of integer values in multiple columns of Pandas替换 Pandas 多列中的一系列整数值
【发布时间】:2019-08-06 21:36:01
【问题描述】:

我有以下数据框:

Index ColA ColB ColC ColD 
0       1    4   13   ABC
1       12   1   24   ABC
2       36   18  1    ABC
3       41   45  1    ABC

现在我正在寻找一个简单的命令来转换 pandas df,使 ColA、ColB 和 ColC 的值如下所示:

for each row:
   if value in ColA <= 12 then 1
   if value in ColA > 12 and <= 24 then 2
   if value in ColA > 24 and <= 36 then 3
   if value in ColA > 36 then 4

(其他栏也一样)

所以结果应该是这样的:

Index ColA ColB ColC ColD 
0       1    1   2    ABC
1       1    1   2    ABC
2       3    2   1    ABC
3       4    4   1    ABC

有没有简单的方法来实现这一点? :-)

最好的问候, 安德烈

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用pandas提供的功能来解决这个问题。

    基本上,您可以使用 pandas 数据框提供的函数遍历所有列并将位于某个范围内的列的所有值更改为新值。

    import pandas as pd
    import numpy as np
    
    df = pd.DataFrame()
    
    df["ColA"] = [1, 12, 32, 24]
    df["ColB"] = [23, 11, 6, 45]
    df["ColC"] = [10, 25, 3, 23]
    
    print(df)
    

    输出:

       ColA  ColB  ColC
    0     1    23    10
    1    12    11    25
    2    32     6     3
    3    24    33    23
    

    现在,我们将使用代码 df['ColA'].between(0,12) 查找具有给定范围内的值的列的所有索引,并使用代码 df.loc[df['ColA'].between(0,12), 'ColA'] = 1 为该列的这些索引分配新值。

    这是为 ColA 完成的,现在要对数据帧的所有列执行此操作,我们将使用循环,这可以使用以下代码完成。

    for col in df.columns:
        df.loc[df[col].between(0,12), col] = 1
        df.loc[df[col].between(13,24), col] = 2
        df.loc[df[col].between(25,36), col] = 3
    
    print(df)
    

    输出:

       ColA  ColB  ColC
    0     1     2     1
    1     1     1     3
    2     1     1     1
    3     1     3     2
    

    【讨论】:

    • 啊,好吧,我不知道“中间”功能。谢谢!
    【解决方案2】:

    numpy.select的通用解决方案:

    cols = ['ColA','ColB','ColC']
    m1 = df[cols] <= 12
    m2 = df[cols] <= 24
    m3 = df[cols] <= 36
    
    df[cols] = np.select([m1, m2, m3], [1,2,3], default=4)
    print (df)
       ColA  ColB  ColC ColD
    0     1     1     2  ABC
    1     1     1     2  ABC
    2     3     2     1  ABC
    3     4     4     1  ABC
    

    如果您的条件总是需要 [1,2,3,4] 值,则另一种解决方案:

    减去 1 并使用 12 的整数除法,最后添加 1,还添加 DataFrame.clip 以设置阈值之外的最小值和最大值:

    cols = ['ColA','ColB','ColC']
    
    df[cols] = (df[cols].clip(lower=1, upper=37) - 1) // 12 + 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-30
      • 1970-01-01
      • 2016-03-29
      • 1970-01-01
      • 2018-09-29
      • 2019-07-16
      • 1970-01-01
      • 2019-09-07
      相关资源
      最近更新 更多