2016-05-15 69 views
0

這是最終的熊貓挑戰,在我心中,雖然它可能是基本的一些你在那裏......熊貓鏈接到行的行根據多個條件

我試圖連接特定的工作職位與其對應的調查項目。例如,網站A的總裁將歸因於調查項目的結果,網站A的響應者提供反饋意見(即「您同意以下聲明的程度?」:「我認爲網站A的質量是足夠的總體」」)。

每個站點有5個站點(0到4)。每個工作職位分配給一個或多個工作站的一個或多個工作站。

例如,一個網站的總裁工作在該網站中的所有站點,而承包商可能會在幾個站中的2個不同的網站只工作,也許。

調查數據收集在每個站中的每個位點內的質量。

一些調查項目涉及到一個或多個站點內的某些電臺。

例如, 「位置」 表看起來像這樣:

import pandas as pd 
import numpy as np 

pos = pd.DataFrame({'Station(s)':[',1,2,,','0,1,2,3,4'], 
        'Position':['Contractor','President'], 
        'Site(s)':['A,B','A'], 
        'Item(s)':['1','1,2'] 
        }) 

pos[['Position','Site(s)','Station(s)','Item(s)']] 

    Position Site(s)  Station(s) Item(s) 
0 Contractor A,B   ,1,2,,   1 
1 President A   0,1,2,3,4  1,2 

調查數據表看起來像這樣:

sd = pd.DataFrame({'Site(s)':['A','B','B','C','A','A'], 
        'Station(s)':[',1,2,,',',1,2,,',',,,,',',1,2,,','0,1,2,,',',,2,,'], 
        'Item 1':[1,1,0,0,1,np.nan], 
        'Item 2':[1,0,0,1,0,1]}) 
sd[['Site','Station(s)','Item 1','Item 2']] 

    Site Station(s) Item 1 Item 2 
0  A  ,1,2,,   1 1 
1  B  ,1,2,,   1 0 
2  B  ,,,,   0 0 
3  C  ,1,2,,   0 1 
4  A  0,1,2,,   1 0 
5  A  ,,2,,   NaN 1 

2側筆記:

  1. 的由於不重要的原因,項目數據已被編碼爲1和0。

  2. 的逗號分隔的響應實際上是從柱中冷凝(每站和項的一列)。我只提到,因爲如果最好不要濃縮它們,那可以完成(或不完成)。

因此,這裏是我所需要的:

這(我認爲):

Contractor President Site(s) Station(s) Item 1 Item 2 
0  1   1  A  ,1,2,,  1  1 
1  1   0  B  ,1,2,,  1  0 
2  0   0  B  ,,,,   0  0 
3  0   0  C  ,1,2,,  0  1 
4  0   1  A  0,1,2,,  1  0 
5  1   1  A  ,,2,,   NaN  1 

邏輯:

工程的承建商在現場A和B,只應關聯在這些網站工作的受訪者。 在這些受訪者中,他應該只有那些誰在車站1或2的工作,但沒有相關聯的也在 任何人(即站0)工作。

因此,在DF2感興趣的承包商的行是索引0,1,和5 總統的關注行是從指數0,4,5

...,最終,這:

Position Overall% 
0 Contractor 100 
1 President 80 

邏輯:

由於總統涉及項目1和2,有5個號碼來考慮:(1和1)從第1項和(1,0,和1)從第2項。 總和項目是4和計數跨項目是5(再次,不計算'NaN'),這得到80%。

因爲承包商只關注第1項,所以需要考慮兩個數字:1和1 - 不應計算'NaN' - (分別來自感興趣的行)。因此,總數是2的計數,這是2,這給出100%

在此先感謝!

更新

我知道這工作(top answer just under question),但是這怎麼可能被應用到這種情況呢?我想這(只是嘗試邏輯的第一部分):

for i in pos['Position']: 
    sd[i]=[x for x in pos.loc['Site(s)'] if x in sd['Site']] 

...但它拋出這個錯誤:

KeyError: 'the label [Site(s)] is not in the [index]' 

...所以我仍然與它搏鬥。

回答

1

如果我理解正確,您想爲pos中的每個工作職位添加一列到sd。 (這是首要任務。)

所以,在pos各行指標i(我們遍歷行中pos),我們可以創建一個獨特的布爾列:

# PSEUDOCODE: 
sd[position_name_i] = (sd['Site'] IS_CONTAINED_IN pos.loc[i,'Site(s)']) and (sd['Station(s)'] IS_CONTAINED_IN pos.loc[i,'Station(s)']) 

我希望這裏的邏輯清晰並符合您的目標。

表達式X IS_CONTAINED_IN Y可以以許多不同的方式實現。 (我能想到的X和Y集,然後它的X.subset(Y),或者在位掩碼X,Y和bitwise_xor的條款。)

列的名稱,position_name_i可能只是一個整數i。 (或者,如果此列包含唯一值,則爲pos.loc[i,'Position']

如果這樣做了,我們可以執行其他任務。現在,df[df[position_name_i]]將只返回其中position_name_i爲真的df的行。

我們遍歷所有位置(即pos中的行)。對於每一個位置:

# number of non-nan entries in 'Item 1' and 'Item 2' relevant for the position: 
total = df.loc[df['position_name_i'], ['Item 1', 'Item 2']].count().sum() 
# number of 1's among these entries: 
partial = df.loc[df['position_name_i'], ['Item 1', 'Item 2']].sum().sum() 

最終Overall%對於給定的位置是100*partial/total

+0

你的邏輯聽起來很合理。對於電臺,必須滿足以下兩個條件: 1.調查中至少有一個元素(sd ['Station(s)'])必須存在於位置(pos ['Station(s)'])。 2.調查中沒有任何元素(sd ['Station(s)'])不能在職位(pos ['Station(s)']中找到 –

+0

對於網站,來自sd ['Site(s) ']必須存在於pos ['Site(s)'] –

+0

我不確定是否理解站點的條件2條件1是「X和Y的交叉點不是空的」,我想,無論如何,無論條件如何,他們總是可以用集合論的語言來寫(即作爲關於集合,交集,包含等的邏輯句子)。)如果您認爲我的回答不太正確,請隨時編輯它。請詢問是否有不清楚的地方。 – ptrj