python - 根据条件将字符串值替换为前一行值 - Pandas
问题描述
鉴于满足某些条件,我正在尝试根据上一行替换当前行中的值。
条件:
当前行为 0
上一行是 C
在组内(首选,但可能没有)
类似于我的示例数据框:
ID Week value
4 1 W
4 2 C
4 3 0
4 4 0
24 1 W
24 2 W
24 3 0
24 4 A
我需要它看起来像的示例:
ID Week value
4 1 W
4 2 C
4 3 C
4 4 C
24 1 W
24 2 W
24 3 0
24 4 A
其他人提出的我似乎无法修改或不太适合我的问题的问题:
构建类似于我的数据框的代码
import pandas as pd
df = 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]
解决方案
通常,我会使用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'])
推荐阅读
- sass - 尝试安装 sass 并收到有关 webpack 的错误
- python-3.x - Kivy - 单击按钮时,TextInput 文本显示在标签文本中(不是 KV Lang)
- amazon-web-services - 将 IAM 策略附加到 SNS 主题
- excel - 如何在 Excel 中设置生成随机数的种子?
- javascript - 如何将 npm 包集成到客户端项目中
- .htaccess - 如何通过 htaccess 仅重命名特定的 url?
- android - DAO 错误:- 参数的类型必须是使用 @Entity 注释的类或其集合/数组
- typescript - TypeScript“this”问题与范围
- javascript - react js根据键名从对象中获取值
- javascript - 如何在 sequelize v6 中删除自动创建的列 ID?