簡體   English   中英

根據其他列的值將新列添加到數據框

[英]Adding new Column(s) to a dataframe based on value from other column

我已經讀過許多關於此的問題,但是我無法弄清楚如何將這些解決方案應用於自己的問題。 我認為我必須使用df.applydf.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM