python - 在一列上使用多个条件来分配新列的值

标签 python python-3.x pandas any

我正在尝试根据现有列中的字符串为我的数据分配 8 个标签之一。但是,使用我使用的方法出现此错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

我要查找 144 个不同的字符串,我想将它们分配给 8 个标签。

这是我的意思的一个简化示例。如果 A 是我的数据框中的现有列,我想使用根据 A 的值分配的字符串创建 B。

数据框:

   A     B
0  1   low
1  1   low
2  2   mid
3  3   mid
4  5  high
5  4   mid
6  2   mid
7  5  high

我目前使用的代码是这样的:

for index, row in df.iterrows():
    if df['A'] == 1:
        df['Label'] = 'low'
    elif any([df['A'] == 2, df['A'] == 3, df['A'] == 4]):
        df['Label'] = 'mid'
    elif df['A'] == 5:
        df['Label'] = 'high'

我认为是 any() 的使用给我带来了错误。 据我了解,这是因为 pandas 的工作原理,但我不太了解。有没有更简单的方法来做到这一点?

任何帮助或指点将不胜感激:)

最佳答案

这里不需要itterrows,就是bad practice并且被认为很慢。

方法一pd.cut

df['B'] = pd.cut(df['A'], [0,1,4,10], labels=['low', 'mid', 'high'])

   A     B
0  1   low
1  1   low
2  2   mid
3  3   mid
4  5  high
5  4   mid
6  2   mid
7  5  high

方法2 np.select

conditions = [
    df['A'] == 1,
    df['A'].isin([2, 3, 4])
]

choices = ['low', 'mid']

df['B'] = np.select(conditions, choices, default='high')

   A     B
0  1   low
1  1   low
2  2   mid
3  3   mid
4  5  high
5  4   mid
6  2   mid
7  5  high

关于python - 在一列上使用多个条件来分配新列的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56835463/

相关文章:

python - 如何在 Python3 中使用两个条件对对象进行排序?

python - Pandas dataframe - lambda 演算和每个系列的最小值

python - 数据帧字典中列的总和

python - 创建 Pandas DataFrame 以与 ggPlot 线图一起使用

python - 如何遍历按值排序的 Python 字典?

python - 如何更改pygame中按键的名称?

python - 如何在 python 64bit 中枚举模块

python - 在 SQLAlchemy 中使用 selectinload 加载相关对象时的排序顺序

python - 将文件加载到 2d numpy 数组中的有效方法

python - 获取数据框中每个用户发生类别更改的日期