2017-10-14 52 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

太棒了,非常感谢! –

相关问题