以 gt/lt 条件作为键应用 pandas 字典

问题描述 投票:0回答:1

我创建了以下 pandas 数据框:

ds = {'col1':[1,2,2,3,4,5,5,6,7,8]}

df = pd.DataFrame(data=ds)

数据框如下所示:

print(df)

   col1
0     1
1     2
2     2
3     3
4     4
5     5
6     5
7     6
8     7
9     8

然后我创建了一个新字段,名为

newCol
,其定义如下:

def criteria(row):
    if((row['col1'] > 0) & (row['col1'] <= 2)):
        return "A"
    elif((row['col1'] > 2) & (row['col1'] <= 3)):
        return "B"
    else:
        return "C"
    
df['newCol'] = df.apply(criteria, axis=1)

新的数据框如下所示:

print(df)

   col1 newCol
0     1      A
1     2      A
2     2      A
3     3      B
4     4      C
5     5      C
6     5      C
7     6      C
8     7      C
9     8      C

是否有可能创建这样的字典:

dict = {
        
        '0 <= 2' : "A",
        '2 <= 3' : "B",
        'Else' : "C"

        }

然后将其应用到数据框:

df['newCol'] = df['col1'].map(dict)

有人可以帮助我吗?

python pandas dataframe dictionary calculated-columns
1个回答
1
投票

是的,你可以用

IntervalIndex
来做到这一点:

dic = {(0, 2): 'A',
       (2, 3): 'B',
      }
other = 'C'

bins = pd.IntervalIndex.from_tuples(dic)
labels = list(dic.values())

df['newCol'] = (pd.Series(labels, index=bins)
                  .reindex(df['col1']).fillna(other)
                  .tolist()
               )

但是鉴于您的示例,使用

cut
似乎更直接:

df['newCol'] = pd.cut(df['col1'], bins=[0, 2, 3, np.inf], labels=['A', 'B', 'C'])

输出:

   col1 newCol
0     1      A
1     2      A
2     2      A
3     3      B
4     4      C
5     5      C
6     5      C
7     6      C
8     7      C
9     8      C

如果您坚持使用原始词典格式,您可以使用以下方法进行转换:

dic = {'0 <= 2' : "A",
       '2 <= 3' : "B",
       'Else' : "C"
}

dic2 = {tuple(map(int, k.split(' <= '))): v for k, v in dic.items()
        if k != 'Else'}
# {(0, 2): 'A', (2, 3): 'B'}
other = dic['Else']
© www.soinside.com 2019 - 2024. All rights reserved.