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
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
然后您需要重新排列列顺序
添加回答
举报