2016-06-07 19 views
0

我想複製類似於Alteryx中的「多行公式」工具的東西。我正在閱讀一個csv文件,並希望能夠在列表中設置一個值,如果同一個測試列中的另一行的值爲true。基於當前行上方或下方第n行的條件 - Python

樣本數據

**Country** 
China 
India 
Brazil 
Indonesia 

當它遍歷包含巴西行,「Y」應附加到新的名單,因爲中國是上面兩行。其餘的應該附加「N」。

import pandas as pd 

csv_in = pd.read_csv('C:/sample.csv') 

kind = []       

for row in csv_in['Country']: 
    if ***two rows above this row*** == 'China': 
     kind.append('Y') 
    elif ***one row below this row*** == 'Canada': 
     kind.append('Y') 
    else: 
     kind.append("N") 

csv_in['Result'] = kind 

我無法找到任何特定於此問題的內容。任何幫助,將不勝感激!

編輯:我意識到我需要做的更多一點,除了我最初提出的問題。

for row in csv_in['Country']: 
     if 'hina' in ***two rows above this row***: 
      kind.append('Y') 
     elif ***one row below this row***.startswith('Can'): 
      kind.append('X') 
     else: 
      kind.append("N") 
+0

它以某種方式讀取笨拙遍歷可轉位結構像熊貓數據幀,然後使用偏移了兩個特殊情況作爲條件來構建元件明智的布爾序列具有相同的長度和隱式1到1兩個「列表」中的位置之間的映射。根據數據幀「國家」列長度的長度,一次性準備一個Falsy或'N'列表,並找到數據幀的特殊情況索引,並分別將以下2行和1以上的偏移量設置爲True或'y'。 ...現在@root已經放入答案;-) – Dilettant

回答

1

使用shift打造的,其中'Y'值應該會出現一個布爾數組,然後使用numpy.where創建列:

import numpy as np 

y_cond = (csv_in.shift(2) == 'China') | (csv_in.shift(-1) == 'Canada') 
csv_in['Result'] = np.where(y_cond, 'Y', 'N') 

如果您的數據幀有多個列,你」您需要使用csv_in['Country'].shift()而不是上面代碼中的簡短符號。

一些略有擴大樣本數據輸出的結果:

 Country Result 
0  China  N 
1  India  N 
2  Brazil  Y 
3 Indonesia  N 
4  Bhutan  N 
5  Mexico  Y 
6  Canada  N 
7  Peru  N 
8 Honduras  N 

編輯:

如果你要分配非二進制值,我會採取略有不同的方法。

首先將結果初始化爲'N'。對於每種情況,請像以前一樣創建一個布爾數組,並使用loc來指定所需的值。以相反的順序執行此操作,因爲隨後的匹配會覆蓋以前的匹配項。

請注意,您可以使用.str訪問器將字符串函數應用於列,如文檔的Working with Text Data部分所述。

csv_in['Result'] = 'N' 

x_cond = csv_in['Country'].shift(-1).str.startswith('Can').fillna(False) 
csv_in.loc[x_cond, 'Result'] = 'X' 

y_cond = csv_in['Country'].shift(2).str.contains('hina').fillna(False) 
csv_in.loc[y_cond, 'Result'] = 'Y' 

.fillna(False)是必要的,需要loc純粹布爾值,並且shift介紹NaN值。如果你真的想按重要性編寫你的條件,你可以在loc之內做一些類似x_cond & (csv_in['Result'] == 'N')的事情,儘管它可能會影響性能。

更新輸出:

 Country Result 
0  China  N 
1  India  N 
2  Brazil  Y 
3 Indonesia  N 
4  Bhutan  N 
5  Mexico  X 
6  Canada  N 
7  Peru  N 
8 Honduras  N 
+0

謝謝!這正是我所問的!但我是一個白癡,如果我想讓加拿大返回「X」代替。如果我想使用startswith()或「in」,該怎麼辦?我收到此錯誤:'系列對象沒有啓動屬性'。我更新了笨拙的代碼。對於那個很抱歉! –

+0

我已經更新了我的答案。 – root

相關問題