繁体   English   中英

Pandas:根据条件和前行值创建列值

[英]Pandas: Create Column Values Based on Condition and Previous Rows Values

我想在 Pandas dataframe 'df' 中创建一个列,在这个给定的示例中为“金额”,其中每行的值基于其先前的行以及另一列“id”的值。 例如,如果“id”已经在“金额”列中分配了值 30,则为 0,否则为 30。

预期结果如下图:

id  amount
a   30
b   30
a   0
a   0
c   30
a   0
c   0
b   0
b   0
a   0
a   0

我以为我可以通过 groupby 和 lambda 的某种组合来实现这一点,但遗憾的是我一再碰壁。

我尝试的是:

df['amount'] = df.apply(lambda x: 30 if df.groupby('id')['amount'].cumsum()<30 else 0)

这给了我以下错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

如果解决方案很明显,我提前道歉,但不幸的是,到目前为止我还没有找到任何可以解决这个问题的方法。

谢谢

您可以像这样使用替代列:

import numpy as np    
df1["pastcol"]=[np.nan]+list(df1["amount"])[:-1]

Output:

   id  amount  pastcol
0   a      30      NaN
1   b      30     30.0
2   a       0     30.0
3   a       0      0.0
4   c      30      0.0
5   a       0     30.0
6   c       0      0.0
7   b       0      0.0
8   b       0      0.0
9   a       0      0.0
10  a       0      0.0

谢天谢地,我能够回答我自己的问题。 对于任何有兴趣的人,我通过以下方法取得了成功:

df['amount'] = df['amount'].where(df.groupby('id')['amount'].shift().cumsum() < 30, 30)

感谢所有分享他们想法的人!

# Import Moduel
import pandas as pd
import numpy as np

# Data Preparation and Preprocess
df = pd.DataFrame({'id':['a','b','a','a','c','a','c','b','b','a','a'],
'amount':[30,30,0,0,30,0,0,0,0,0,0]}
)
df['Orig_Index'] = df.reset_index().index
df['Dup_Seq'] = df.groupby(['id']).cumcount()+1
df_required = df.loc[df['Dup_Seq']==1].replace()
df_final = pd.merge(df, df_required[['Orig_Index','Dup_Seq']], left_on='Orig_Index', right_on='Orig_Index', how='left')
df_final['amount_v2'] = np.where(df_final['Dup_Seq_y'] ==1 , 30,0)
df_final.drop(['amount','Orig_Index','Dup_Seq_x','Dup_Seq_y'],axis=1,inplace=True)
df_final.rename(columns = {'amount_v2':'amount'},inplace=True)

# Data Display
df_final

嗨弗朗西斯,

请尝试上面的代码,它会帮助你,

如果您有任何问题,请告诉我

谢谢莱昂

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM