繁体   English   中英

Python - 根据另一列逐步递增地为一列赋值

[英]Python - Assigning value to one column based on another with stepwise increments

我有一个带有 ID 列的 df,需要根据特定值对其进行解构。

ID
401
402
403
404

对于解构,ID = 401、405、409(即递增4)对应值“A”,ID = 402、406、410对应值“B”

我想创建一个存储值 A、B 的列“VALUE”,该列基于具有 4 步增量的 ID 列的解构。

ID 价值
401 A
402
403 C
404
405 A
406

我尝试了一些简单的 while 和 if 逻辑,但它们就是不起作用。 不值得在这里提供我的代码。

有谁知道我们如何在 python 中做到这一点?

谢谢

一种简单的方法是定义一个查找表,然后在 DataFrame 上使用 function apply() 。这是一个简单的片段:

import pandas as pd
d = {0: "A", 1: "B", 2: "C", 3: "D"}
df = pd.DataFrame({'ID': range(20)})
df['VALUE'] = df['ID'].apply(lambda x: d[x % 4])

您可以将模运算 ( % ) 与numpy.select结合使用。

condition_list = [df['ID'] % 4 == 1, df['ID'] % 4 == 2, df['ID'] % 4 == 3]
choice_list = ['A', 'B', 'C']
default_value = 'D'

df['VALUE'] = np.select(condition_list, choice_list, default_value)

或者,将模运算符与pandas.Series.map结合使用。

df['VALUE'] = (df['ID'] % 4).map({0: 'D', 1: 'A', 2: 'B', 3: 'C'})

如果 ID 列是连续的并且从 401 开始的简单解决方案:

df['VALUE'] = np.tile(['A', 'B', 'C', 'D'], len(df) // 4 + 1)[:len(df)]

或者,您可以通过模数 (%) 除法创建重复序列,然后添加 65 以偏移序列以表示 ascii 大写字符

df['VALUE'] = df['ID'].sub(1).mod(4).add(65).map(chr)
# OR df['VALUE'] = (65 + (df['ID'] - 1) % 4).astype('uint32').view('U1')

结果

    ID VALUE
0  401     A
1  402     B
2  403     C
3  404     D
4  405     A
5  406     B

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM