pandas Python -基于一列为另一列赋值(逐步递增)

8hhllhi2  于 2023-02-02  发布在  Python
关注(0)|答案(3)|浏览(522)

我有一个带有ID列的df,需要根据特定的值对其进行解构。
| 识别号|
| - ------|
| 四○一|
| 四○二|
| 四○三|
| 四○四|
对于解构,ID = 401、405、409(即增量4)对应于值"A",并且ID = 402、406、410对应于值"B"。
我想创建一个列"VALUE",它基于ID列的解构和4步增量来存储值A、B。
| 识别号|价值|
| - ------|- ------|
| 四○一|A类|
| 四○二|乙|
| 四○三|C级|
| 四○四|D级|
| 四○五|A类|
| 四○六|乙|
我尝试了一些简单的while和if逻辑,但它们就是不起作用。不值得在这里提供我的代码。
有谁知道在python里怎么做吗?
谢谢

ldioqlga

ldioqlga1#

一个简单的方法是定义一个查找表,然后在DataFrame上使用函数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])
yc0p9oo0

yc0p9oo02#

您可以将取模运算(%)与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'})
z31licg0

z31licg03#

如果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

相关问题