替换DataFrame中多个条件上的多个值

2024-09-28 01:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下代码,它生成了一个包含7列和40000行的df:

df = pd.DataFrame(np.random.random(size=(40000, 7)), columns=list('ABCDEFGH'))

如何将小于1/3的每个值替换为“a”,将介于1/3和2/3之间的每个值替换为“b”,将高于2/3和低于1的任何值替换为“c”?我尝试过使用pd.cut(),但它似乎只适用于一列。我也尝试过:

df[df <= 1/3] = "a"
df[(df > 1/3) & (df < 2/3)] = "b"
df[df > 2/3] = "c"

Tags: columns代码dataframedfsizenprandomlist
3条回答

在将整数与第一步中替换的字符串进行比较的第二步中,您可能会遇到错误。试试这个

    t1=df <= 1/3
    t2=(df > 1/3) & (df < 2/3)
    t3=df > 2/3
    df[t1]="a"
    df[t2]="b"
    df[t3]="c"

我们首先进行比较并保存过滤器,然后进行更改

您可以使用^{},您可以添加尽可能多的条件和选项^{}小于,^{}大于,^{}小于等于,^{}大于等于

np.random.seed(0) # for reproducing same results
df = pd.DataFrame(np.random.random(size=(40000, 7)), columns=list('ABCDEFG'))
df.head()

          A         B         C         D         E         F         G
0  0.548814  0.715189  0.602763  0.544883  0.423655  0.645894  0.437587
1  0.891773  0.963663  0.383442  0.791725  0.528895  0.568045  0.925597
2  0.071036  0.087129  0.020218  0.832620  0.778157  0.870012  0.978618
3  0.799159  0.461479  0.780529  0.118274  0.639921  0.143353  0.944669
4  0.521848  0.414662  0.264556  0.774234  0.456150  0.568434  0.018790

condlist = [df.lt(1/3), (df.gt(1/3)&df.lt(2/3)]
choicelist = ['a', 'b']
df = pd.DataFrame(np.select(condlist, choicelist, 'c')
df.head()
    A   B   C   D   E   F   G
0   b   c   b   b   b   b   b
1   c   c   b   c   b   b   c
2   a   a   a   c   c   c   c
3   c   b   c   a   b   a   c
4   b   b   a   c   b   b   a

或者使用^{}^{}

# Using the same df as above.
df.apply(pd.cut,
         bins=[0, 1/3, 2/3, 1], 
         labels=['a', 'b', 'c']
        )

   A  B  C  D  E  F  G
0  b  c  b  b  b  b  b
1  c  c  b  c  b  b  c
2  a  a  a  c  c  c  c
3  c  b  c  a  b  a  c
4  b  b  a  c  b  b  a

使用applymap

Apply map documentation

def remap(x):
    if x <= 1/3:
        return 'a'
    elif x > 1/3 and x < 2/3:
        return 'b'
    else:
        return 'c'

df.applymap(remap)

每当您想“用另一个数组替换数组中的项目”时,您通常都想使用map

相关问题 更多 >

    热门问题