亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

基于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 關注
  • 491 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號