![](/img/trans.png)
[英]how to loop adding new column to pandas dataframe with value is based on other column value
[英]Adding new Column(s) to a dataframe based on value from other column
我已經讀過許多關於此的問題,但是我無法弄清楚如何將這些解決方案應用於自己的問題。 我認為我必須使用df.apply
或df.assign
但是即使閱讀文檔,我也不知道如何
這是我的數據:
d = {'switchopen': [True, True, False, False, False, False, False, False, False, False, False, False, False, True, True, False, False, True ],
'switchclose': [ False, False, False, False, False, True, True, True, True, True, False, False, False, False, False, False, False, False]}
df = pd.DataFrame(data=d)
當switchopen == True & switchclose == False
時打開
當switchopen == False & switchclose == True
時關閉
當switchopen == False & switchclose == False
時,它正在移動
我當前的解決方案是這樣的:
dfopen = df[(df.switchclose == False) & (df.switchopen == True)]
dfopen['Open'] = 'open'
dfclose = df[(df.switchclose == True) & (df.switchopen == False)]
dfclose['Moving'] = 'close'
dfmoving = df[(df.switchclose == False) & (df.switchopen == False)]
dfmoving['Close'] = 'moving'
dfs = [dfopen, dfclose, dfmoving]
dfz = pd.concat(dfs, sort= False)
dfz = dfz.sort_index(ascending=True)
dfz['Position'] = dfz['Position'].fillna(dfz['Open'])
dfz['Position'] = dfz['Position'].fillna(dfz['Close'])
print(dfz['Position'])
這給了我我想要的東西,但是我正在尋找更好的解決方案,例如:
df['Close'] = (df.switchclose == True & df.switchopen == False)
df['Open'] = (df.switchclose == False & df.switchopen == False)
df['Moving'] = (df.switchclose == False & df.switchopen == False)
然后使用.fillna
。
最好是有一個解決方案甚至不需要該步驟
預期的輸出是這樣的:
Position
0 open
1 open
2 moving
3 moving
4 moving
5 close
6 close
7 close
8 close
9 close
10 moving
11 moving
12 moving
13 open
14 open
15 moving
16 moving
17 open
考慮到您的邏輯需求和輸出期望,這應該可行
df.loc[(df['switchopen'] == True) & (df['switchclose'] == False), 'Position'] = 'open'
df.loc[(df['switchopen'] == False) & (df['switchclose'] == True), 'Position'] = 'closed'
df.loc[(df['switchopen'] == False) & (df['switchclose'] == False), 'Position'] = 'moving'
對於多種情況,可以使用np.select
。 您可以先定義條件:
c1 = df.switchopen & ~df.switchclose
c2 = ~df.switchopen & df.switchclose
c3 = ~df.switchopen & ~df.switchclose
而右邊項指定choicelist
從中提取輸出內容:
df['position'] = np.select([c1,c2, c3], ['open','closed', 'moving'])
switchopen switchclose position
0 True False open
1 True False open
2 False False moving
3 False False moving
4 False False moving
5 False True closed
6 False True closed
7 False True closed
8 False True closed
9 False True closed
10 False False moving
11 False False moving
12 False False moving
13 True False open
14 True False open
15 False False moving
16 False False moving
17 True False open
我喜歡np.where。 這是解決方案:
import numpy as np
df.loc[:,'position1'] = np.where((df['switchopen'] == True) & (df['switchclose'] == False), 'open',
np.where((df['switchopen'] == False) & (df['switchclose'] == True), 'closed',
np.where((df['switchopen'] == False) & (df['switchclose'] == False), 'moving',
np.nan)))
如您所見,您可以為兩個條件都設置NaN。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.