2017-10-14 55 views
1

我正嘗試爲數據框內的數據子集創建訂單號。對於新列(「strike_order」),我想檢查「option_expiration」列的值是否等於上述行中的「option_expiration」列的值,如果不等於(即新子集)設置值「 strike_order「設置爲1.如果相等,則將值設置爲上一行」strike_order「+1。通過在列和行之間進行比較創建子集訂單

Jupyter中錯誤消息底部的錯誤是KeyError:'label [06/15/2001] is未在[索引]」

實施例:

df = pandas.DataFrame([[2,1],[2,2],[2,3],[2,4],[4,1],[4,2]],columns= 
["source_column","desired_output"])#, index = ["1","2","3","4","5","5"]) 
df 

    source_column desired_output 
0 2   1 
1 2   2 
2 2   3 
3 2   4 
4 4   1 
5 4   2 

即,當源列改變值時,它觸發從1新的計數在輸出列

我的代碼如下:

def compare(i): 
    for i in df.loc[i,"source_column"]: 
    if i <1 : 
     return 1 #populates first row as 1 

    elif df.loc[i,"source_column"] == df.loc[i- 
1,"source_column"]: 
      return compare(i-1) +1 
    else: 
     return 1   


df["desired_output"]=df["source_column"].apply(compare) 
+1

如果你能發佈更多的數據在您的問題可以幫助! – ileadall42

+0

輸入數據文件和python腳本現在通過鏈接連接到dropbox –

+0

如果您發佈帶有代表性示例數據的[MCVE](https://stackoverflow.com/help/mcve),您可能會得到更快的幫助,而不是發佈一個鏈接到一個zip文件。除了讓我們更容易幫助你,你可能會發現花時間去開發一個具有代表性的,最小化的例子往往是獲得問題清晰度的好的第一步。 –

回答

0

您可以使用秩()

df = pd.DataFrame({'source_column': [2,2,2,2,4,4]}) 
df['strike_order'] = df.groupby('source_column').source_column.rank(method = 'first')\ 
.astype(int) 

你得到

source_column strike_order 
0 2    1 
1 2    2 
2 2    3 
3 2    4 
4 4    1 
5 4    2 
+0

非常感謝你。 –

0

其所謂的累計數,您可以直接做到這一點,像這樣。

df['new'] = df.groupby('source_column').cumcount()+1 
 
    source_column desired_output new 
0    2    1 1 
1    2    2 2 
2    2    3 3 
3    2    4 4 
4    4    1 1 
5    4    2 2 
In [453]: 
+0

太棒了,非常感謝! –

相關問題