为了账号安全,请及时绑定邮箱和手机立即绑定

基于python中的逻辑表达式使用for循环创建新列

基于python中的逻辑表达式使用for循环创建新列

呼啦一阵风 2022-01-11 15:57:00
我有以下数据框:df1 = pd.DataFrame()df1 ['TG'] = [0,2,1,3,5,7,]df1['Value'] =[0.2,0.5,0.015,0.6,0.11,0.12]我想根据 TG 列的值(即 <1、<2、<3、<4 和 >0、>1、>2、>3 等)创建新列。列名将是 U0.5, U1.5,U2.5,U3.5,O0.5,O1.5,O2.5,O3.5 因此,我将有 8 个具有上述列名的新列。每个单元格的值将来自值列。我的预期输出如下:我可以使用 np.where 一次创建一个新列。谁能告诉我如何循环执行?
查看完整描述

2 回答

?
繁花不似锦

TA贡献1851条经验 获得超4个赞

使用 numpy 广播,因此不需要循环:


#create array

arr = np.arange(1, 5) - .5

print (arr)

[0.5 1.5 2.5 3.5]


#create Mx1 arrays from Series

vals = df1['Value'].values[:, None]

tg = df1['TG'].values[:, None]


#compare arrays and multiple, use DataFrame constructor

df2 = pd.DataFrame((arr > tg) * vals, columns=arr).add_prefix('U')

df3 = pd.DataFrame((arr < tg) * vals, columns=arr).add_prefix('O')


#join all together

df = pd.concat([df1, df2, df3], axis=1)

print (df)  

   TG  Value  U0.5   U1.5   U2.5   U3.5   O0.5  O1.5  O2.5  O3.5

0   0  0.200   0.2  0.200  0.200  0.200  0.000  0.00  0.00  0.00

1   2  0.500   0.0  0.000  0.500  0.500  0.500  0.50  0.00  0.00

2   1  0.015   0.0  0.015  0.015  0.015  0.015  0.00  0.00  0.00

3   3  0.600   0.0  0.000  0.000  0.600  0.600  0.60  0.60  0.00

4   5  0.110   0.0  0.000  0.000  0.000  0.110  0.11  0.11  0.11

5   7  0.120   0.0  0.000  0.000  0.000  0.120  0.12  0.12  0.12

循环解决方案:


arr = np.arange(1, 5) - .5

for x in arr:

    df1[f"U{x}"] = df1["Value"] * (df1["TG"] < x)

for x in arr:

    df1[f"O{x}"] = df1["Value"] * (df1["TG"] > x)


print (df1)

   TG  Value  U0.5   U1.5   U2.5   U3.5   O0.5  O1.5  O2.5  O3.5

0   0  0.200   0.2  0.200  0.200  0.200  0.000  0.00  0.00  0.00

1   2  0.500   0.0  0.000  0.500  0.500  0.500  0.50  0.00  0.00

2   1  0.015   0.0  0.015  0.015  0.015  0.015  0.00  0.00  0.00

3   3  0.600   0.0  0.000  0.000  0.600  0.600  0.60  0.60  0.00

4   5  0.110   0.0  0.000  0.000  0.000  0.110  0.11  0.11  0.11

5   7  0.120   0.0  0.000  0.000  0.000  0.120  0.12  0.12  0.12


查看完整回答
反对 回复 2022-01-11
?
SMILET

TA贡献1796条经验 获得超4个赞

如果你仍然想要一个循环,有一种简单而优雅的方法来做到这一点:


l = [0.5, 1.5, 2.5, 3.5]

for item in l:

    df1["U" + str(item)] = df1["Value"] * (df1["TG"] < item)

    df1["O" + str(item)] = df1["Value"] * (df1["TG"] > item)

输出是:


TG  Value   U0.5    O0.5    U1.5    O1.5    U2.5    O2.5    U3.5    O3.5

0   0   0.200   0.2 0.000   0.200   0.00    0.200   0.00    0.200   0.00

1   2   0.500   0.0 0.500   0.000   0.50    0.500   0.00    0.500   0.00

2   1   0.015   0.0 0.015   0.015   0.00    0.015   0.00    0.015   0.00

3   3   0.600   0.0 0.600   0.000   0.60    0.000   0.60    0.600   0.00

4   5   0.110   0.0 0.110   0.000   0.11    0.000   0.11    0.000   0.11

5   7   0.120   0.0 0.120   0.000   0.12    0.000   0.12    0.000   0.12

然后您需要重新排列列顺序


查看完整回答
反对 回复 2022-01-11
  • 2 回答
  • 0 关注
  • 457 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信