pandas 保持相同的名称,直到在另一个panda列中value = true

dxxyhpgq  于 2023-01-19  发布在  其他
关注(0)|答案(3)|浏览(115)

我有一个包含3列的 Dataframe :一米零一米零一米零一米零一米零一米零一米零一米零一米零二米零一米零。
我需要创建一个新列new_name,其中新名称将设置为第一个name,其中reset_flag=True,然后它将继续使用该名称WITHIN该会话,直到出现新的reset_flag
不太确定最好的接近方式。
编辑:我想到了一个方法,用df. iterrows()来实现,先存储到list中,然后再追加,但看起来很笨重。有没有更有效的"panda"方法?
样本预期输出
| 会话标识|姓名|重置标志|新名称|
| - ------|- ------|- ------|- ------|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名1|正确|某人姓名1|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名1||某人姓名1|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名1||某人姓名1|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名2|正确|某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名2||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名2||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名3||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名3||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名4||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名4||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名4||某人姓名2|
| 06c97a-bc7 - 6cc-29f-65978ee8d型柴油机|某人姓名5|正确|某人姓名5|
| 小行星3943|某人姓名1|正确|某人姓名1|
| 小行星3943|某人姓名1||某人姓名1|
| 小行星3943|某人姓名1||某人姓名1|
| 小行星3943|某人姓名2||某人姓名1|
| 小行星3943|某人姓名2||某人姓名1|
| 小行星3943|某人姓名2||某人姓名1|
| 小行星3943|某人姓名3|正确|某人姓名3|
| 小行星3943|某人姓名3||某人姓名3|
| 小行星3943|某人姓名4||某人姓名3|
| 小行星3943|某人姓名4||某人姓名3|
| 小行星3943|某人姓名4||某人姓名3|
| 小行星3943|某人姓名5|正确|某人姓名5|
| 小行星3943|某人姓名6||某人姓名5|

eaf3rand

eaf3rand1#

应用新名称,然后填写

df['new_name'] = df.apply(lambda r: r['name'] if r['reset_flag'] else np.nan, aixs=1).fillna(method='ffill')
y3bcpkx1

y3bcpkx12#

一种有效的方法是在“reset_flag”列上使用cumsum:这将为您提供一列数字,这些数字在每次遇到True时增加。
然后,您可以简单地按此列进行分组,以获得所需的结果(我假设您的“reset_flag”列是布尔值):

df["new_name"] = df.groupby(df["reset_flag"].cumsum())["name"].transform("first")
6ie5vjzr

6ie5vjzr3#

不确定是否有更有效的方法,但这应该工作:

df['new_name'] = np.nan

session_name = np.nan

for index, row in df.iterrows():
  # I assume the 'TRUE' in your col is str. 
  if row['reset_flag'] == 'TRUE':
    df['new_name'][index] = row['name']
    session_name = row['name']
  else: 
    df['new_name'][index] = session_name

相关问题