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

标签 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  

正如您在预期数据帧中看到的,CP 列中的 0 数量比 Periods 中的值少 1列,剩余值为 1。

我尝试了下面的 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 的新列将包含现金流量的时间值(考虑债券的半年现金流量)

最佳答案

这里似乎不需要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

关于python - Pandas Groupby 并使用自定义值创建新列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53606528/

相关文章:

python - 在 python 中,如何使 print_slow() 更快或通过按 enter 或键跳过它?

python - 将 linsolve 解映射到 Sympy 中的索引符号

python - 将整个数据框中的 NaN 值替换为其他值的平均值

python - 在 Pandas 中,如何将 "long"表转换为 "wide and sparse"表?

python - Pandas set_levels,如何避免标签排序?

python - 如何将 pandas DataFrame 的索引 dtype 更改为 int32?

python - 如何在python中传递csv文件的第一列

python - 使用 pygame 创建 slider

Python NumPy 数组数据类型

python 错误 - numpy 数组上的移动平均值