我有以下数据框:
Index ColA ColB ColC ColD
0 1 4 13 ABC
1 12 1 24 ABC
2 36 18 1 ABC
3 41 45 1 ABC
现在,我正在寻找一个简单的命令来转换pandas df,使ColA,ColB和ColC的值类似于以下内容:
for each row:
if value in ColA <= 12 then 1
if value in ColA > 12 and <= 24 then 2
if value in ColA > 24 and <= 36 then 3
if value in ColA > 36 then 4
(其他列也相同)
所以结果看起来像这样:
Index ColA ColB ColC ColD
0 1 1 2 ABC
1 1 1 2 ABC
2 3 2 1 ABC
3 4 4 1 ABC
有没有简单的方法可以实现这一目标? :-)
最好的问候, 安德烈
答案 0 :(得分:2)
您可以使用熊猫提供的功能来解决此问题。
基本上,您可以遍历所有列,并使用pandas数据框提供的功能将范围内的列的所有值更改为新值。
import pandas as pd
import numpy as np
df = pd.DataFrame()
df["ColA"] = [1, 12, 32, 24]
df["ColB"] = [23, 11, 6, 45]
df["ColC"] = [10, 25, 3, 23]
print(df)
输出:
ColA ColB ColC
0 1 23 10
1 12 11 25
2 32 6 3
3 24 33 23
现在,我们将使用代码df['ColA'].between(0,12)
查找具有给定范围内值的列的所有索引,并使用代码df.loc[df['ColA'].between(0,12), 'ColA'] = 1
为该列分配这些索引的新值。 / p>
这是为ColA完成的,现在要对数据帧的所有列执行此操作,我们将使用循环,并且可以使用以下代码来完成。
for col in df.columns:
df.loc[df[col].between(0,12), col] = 1
df.loc[df[col].between(13,24), col] = 2
df.loc[df[col].between(25,36), col] = 3
print(df)
输出:
ColA ColB ColC
0 1 2 1
1 1 1 3
2 1 1 1
3 1 3 2
答案 1 :(得分:0)
使用numpy.select
的常规解决方案:
cols = ['ColA','ColB','ColC']
m1 = df[cols] <= 12
m2 = df[cols] <= 24
m3 = df[cols] <= 36
df[cols] = np.select([m1, m2, m3], [1,2,3], default=4)
print (df)
ColA ColB ColC ColD
0 1 1 2 ABC
1 1 1 2 ABC
2 3 2 1 ABC
3 4 4 1 ABC
如果alwyas需要具有您条件的[1,2,3,4]
值的另一种解决方案:
减去1并使用12
的整数除法,最后加上1
,还加上DataFrame.clip
来设置超出阈值的最小和最大值:
cols = ['ColA','ColB','ColC']
df[cols] = (df[cols].clip(lower=1, upper=37) - 1) // 12 + 1