如何根据有序列表替换pandas dataframe列中的元素?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何根据有序列表替换pandas dataframe列中的元素?相关的知识,希望对你有一定的参考价值。

假设我有这个pandas数据帧:

index  a        b
1    'pika'   'dog'
2    'halo'   'cat'
3    'polo'   'dog'
4    'boat'   'man'
5    'moan'   'tan'
6    'nope'   'dog'

我有一个这样的列表:

colors = ['black' , 'green', 'yellow']

如何用dog列中的所有b替换元素

colors列表中的顺序是一样的吗?

基本上,我希望它看起来像这样:

index  a        b
1    'pika'  'black'
2    'halo'   'cat'
3    'polo'  'green'
4    'boat'   'man'
5    'moan'   'tan'
6    'nope'  'yellow'
答案

使用pd.DataFrame.loc和布尔索引:

df.loc[df['b'].eq('dog'), 'b'] = colors

print(df)

   index     a       b
0      1  pika   black
1      2  halo     cat
2      3  polo   green
3      4  boat     man
4      5  moan     tan
5      6  nope  yellow
另一答案

使用itertools.cycledf.applylambda

In [100]: import itertools as it

In [101]: colors_gen = it.cycle(colors)

In [102]: df1['c'] = df1['b'].apply(lambda x: next(colors_gen) if x == 'dog' else x)

In [103]: df1
Out[103]:
      a    b       c
0  pika  dog   black
1  halo  cat     cat
2  polo  dog   green
3  boat  man     man
4  moan  tan     tan
5  nope  dog  yellow

这也适用于较大的DataFrames

In [104]: df2 = pd.DataFrame({'a': ['pika', 'halo', 'polo', 'boat','moan','nope','etc','etc'], 'b':['dog','cat','dog','man','tan','dog','dog','dog']})

In [106]: df2['c'] = df2['b'].apply(lambda x: next(colors_gen) if x == 'dog' else x)

In [107]: df2
Out[107]:
      a    b       c
0  pika  dog   black
1  halo  cat     cat
2  polo  dog   green
3  boat  man     man
4  moan  tan     tan
5  nope  dog  yellow
6   etc  dog   black
7   etc  dog   green
另一答案

使用numpy put的另一种方式

import pandas as pd
import numpy as np

df = pd.DataFrame({'a': ['pika', 'halo', 'polo', 'boat', 'moan', 'nope'],
                   'b': ['dog', 'cat', 'dog', 'man', 'tan', 'dog']})
colors = ['black' , 'green', 'yellow']

DF

    a       b
0   pika    dog
1   halo    cat
2   polo    dog
3   boat    man
4   moan    tan
5   nope    dog

-

# 'wrap' mode is not needed when replacement list is same
# size as the number of target values
np.put(df.b, np.where(df.b == 'dog')[0], colors, mode='wrap')

DF

    a       b
0   pika    black
1   halo    cat
2   polo    green
3   boat    man
4   moan    tan
5   nope    yellow
另一答案

你可以查看

n=(df.b=="'dog'").sum()

df.loc[df.b=="'dog'",'b']=(['black' , 'green', 'yellow']*(n//3))[:n]

以上是关于如何根据有序列表替换pandas dataframe列中的元素?的主要内容,如果未能解决你的问题,请参考以下文章

如何根据 Pandas 中的列表过滤 DataFrame 中的项目?

如何使用 python 或 pandas 根据包含字典列表的列过滤 DataFrame?

如何从列类型列表中删除 pandas DataFrame 中的空值

Pandas DataFrame:根据条件替换列中的所有值

Pandas - 根据索引替换值

Pandas Dataframe - 根据正则表达式条件替换所有单元格值