为了账号安全,请及时绑定邮箱和手机立即绑定

根据条件将字符串值替换为前一行值 - Pandas

根据条件将字符串值替换为前一行值 - Pandas

holdtom 2022-06-02 12:01:09
鉴于满足某些条件,我正在尝试根据上一行替换当前行中的值。条件:当前行为 0上一行是 C在组内(首选,但可能没有)类似于我的示例数据框:ID  Week value 4    1     W 4    2     C 4    3     0 4    4     024    1     W24    2     W24    3     024    4     A我需要它看起来像的示例:ID  Week value 4    1     W 4    2     C 4    3     C 4    4     C24    1     W24    2     W24    3     024    4     A构建类似于我的数据框的代码import pandas as pddf = pd.DataFrame({'ID': {0:'4', 1:'4', 2:'4', 3:'4', 4:'24', 5:'24', 6:'24', 7:'24'}, 'Week': {0:'1', 1:'2', 2:'3', 3:'4', 4: '1', 5:'2', 6:'3', 7:'4'},  'value': {0:'W', 1:'C', 2:'0', 3:'0', 4: 'W', 5:'W', 6:'0', 7:'A'} })df[['ID', 'Week']] = df[['ID', 'Week']].astype('int')解决问题的尝试效果不佳(引发错误)for i in range(1, len(df)):    if df.value[i] == '0' and df.value[i-1] == 'C':         df.value[i] = 'C'     else:         df.value[i] = df.value[i]
查看完整描述

2 回答

?
GCT1015

TA贡献1827条经验 获得超4个赞

通常,我会使用np.where条件将条件应用于列。但是,给定.shift()函数,如果不将其放入 for 循环中,这将不起作用。一种快速的方法是使用.replace():


for row in range(0,len(df)):

    df['value'] = df['value'].replace('0',df['value'].shift(1))

如果您希望保持有条件,您仍然可以np.where以类似的方式使用。


for row in range(0,len(df)):

    df['value'] = np.where((df['value'] == '0') & (df['value'].shift(1) == 'C'), 'C', df['value'])



查看完整回答
反对 回复 2022-06-02
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

不容易推广到其他情况,但对于您的具体情况,您可以这样做:


is_0 = df['value'] == '0'

is_C_block = df['value'].replace('0', pd.np.nan).fillna(method='ffill') == 'C'


df.loc[is_0 & is_C_block, 'value'] = 'C'


查看完整回答
反对 回复 2022-06-02
  • 2 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信