Pandas Groupby并使用自定义值创建新列

时间:2018-12-04 05:55:27

标签: python pandas numpy dataframe

伙计们

我在用例中搜索了StackOverflow,但找不到任何有用的东西。如果您认为此问题已解决,请指向相应的问题。

用例。

我有以下数据框。

  Maturity,Periods  
  0.5,2   
  0.5,2   
  1.0,3  
  1.0,3   
  1.0,3  

如您所见,根据maturity列中的数字重复periods列。现在,我要完成的工作是创建一个新列,该列将为每个分组的成熟度除1值之外的所有0。所以预期的数据帧就是这样

  Maturity,Periods,CP   
  0.5,2,0  
  0.5,2,1   
  1.0,3,0    
  1.0,3,0   
  1.0,3,1  

正如您在预期数据框中看到的那样,0s列中CP的数量比Periods列中的值小1,其余值为1。< / p>

我尝试了以下pandas groupby操作,但失败了。

new_df['CP'] = new_df.groupby(['Maturity'])['Periods'].apply(lambda x: np.zeros((x-1, 1)) + np.array([1.0])).reset_index()

有人可以指出我要去哪里了吗

更新后的编辑:

作为上述问题的后续措施,如何使用Pandas的操作解决以下方法?

使用上面的数据框,我想创建一个新列,但预期的输出是这样的:

Maturity,Periods,CP,TimeCF  
0.5,2,0,0.5
0.5,2,1,0.5

1.0,3,0,0.5
1.0,3,0,1.0
1.0,3,1,1.0

1.5,4,0,0.5
1.5,4,0,1.0
1.5,4,0,1.5
1.5,4,1,1.5

TimeCF的新列将具有现金流量的时间值(考虑债券的半年现金流量)

1 个答案:

答案 0 :(得分:1)

您似乎在这里不需要groupby ...试试这个:

df['CP'] = 0
df.loc[df['Maturity'].ne(df['Maturity'].shift(-1)), 'CP'] = 1

print(df)
   Maturity  Periods  CP
0       0.5        2   0
1       0.5        2   1
2       1.0        3   0
3       1.0        3   0
4       1.0        3   1

如果groupby是不可避免的,则可以使用与以前类似的方式使用它:

df['CP'] = 0
df.loc[df.groupby('Maturity').apply(lambda x: x.index[-1]), 'CP'] = 1

print(df)
   Maturity  Periods  CP
0       0.5        2   0
1       0.5        2   1
2       1.0        3   0
3       1.0        3   0
4       1.0        3   1