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

根据条件提取列值

根据条件提取列值

繁星点点滴滴 2021-03-31 21:14:47
我有以下数据框df = pd.DataFrame({    'Column_1': ['Position', 'Start', 'End', 'Position'],     'Original_1': ['Open', 'Barn', 'Grass', 'Bubble'],     'Latest_1': ['Shut', 'Horn', 'Date', 'Dinner'],     'Column_2': ['Start', 'Position', 'End', 'During'],     'Original_2': ['Sky', 'Hold', 'Car', 'House'],     'Latest_2': ['Pedal', 'Lap', 'Two', 'Force'],     'Column_3': ['Start', 'End', 'Position', 'During'],     'Original_3': ['Leave', 'Dog', 'Block', 'Hope'],     'Latest_3': ['Sear', 'Crawl', 'Enter', 'Night']})对于“位置_1”,“列_2”或“列_3”中的“位置”一词的每个实例,我想捕获“ Original_1”,“ Original_2”,“ Original_3”中的关联值并将它们分配给名为“ Original_Values”。以下代码可以完成此操作,但只能逐列进行。df['Original_Value1'] = df.loc[df['Column_1'] == 'Position', 'Original_1']df['Original_Value2'] = df.loc[df['Column_2'] == 'Position', 'Original_2']df['Original_Value3'] = df.loc[df['Column_3'] == 'Position', 'Original_3']有没有一种方法可以重新创建上面的代码,使其遍历整个数据帧(而不是按指定的列)?我希望创建一个具有以下结果的列(“ Original_values”):0      Open1      Hold2     Block3    BubbleName: Original_Values, dtype: object
查看完整描述

3 回答

?
浮云间

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

一种方法是使用df.apply():


def choose_orig(row):

    if row['Column_1'] == 'Position':

        return row['Original_1']

    elif row['Column_2'] == 'Position':

        return row['Original_2']

    elif row['Column_3'] == 'Position':

        return row['Original_3']

    return ''


df['Original_Values'] = df.apply(choose_orig, axis=1)

该axis=1给的说法df.apply()原因choose_orig()函数被调用一次,数据帧中的每一行。


请注意'',当所有列均不匹配单词时,它将使用空字符串的默认值'Position'。


查看完整回答
反对 回复 2021-04-09
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

如何使用前3个cols创建遮罩(或指定它们的名称)并将其与6s到9 cols中的值相乘(或指定它们的名称)。然后采用max()值删除nan。


df['Original_Values'] = ((df.iloc[:,:3] == 'Position') * df.iloc[:,6:9].values).max(1)


print(df['Original_values'])

返回值:


0      Open

1      Hold

2     Block

3    Bubble

Name: Original_Value, dtype: object


查看完整回答
反对 回复 2021-04-09
?
蝴蝶不菲

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

这是通过一些堆栈进行操作的一种愚蠢的方法,如果堆栈很大df并且需要避免,则可能会更好axis=1

  • 堆叠前三列以创建索引列表,以及该'Original'值对应于哪一列

  • 堆叠要从中获取值的列。使用上面的列表为它重新编制索引,以便您返回适当的值。

  • df根据原始行索引将这些值恢复为原始值。

这是代码:

import re


mask_list = ['Column_1', 'Column_2', 'Column_3']

val_list = ['Original_1', 'Original_2', 'Original_3']


idx = df[mask_list].stack()[df[mask_list].stack() == 'Position'].index.tolist()

idx = [(x , re.sub('(.*_)', 'Original_', y)) for x, y in idx]


df['Original_Values'] = df[val_list].stack().reindex(idx).reset_index(level=1).drop(columns='level_1')

df 就是现在:


   Column_1  Column_2  Column_3 ... Original_Values

0  Position     Start     Start ...            Open

1     Start  Position       End ...            Hold

2       End       End  Position ...           Block

3  Position    During    During ...          Bubble

如果'Position'在中的任何列中未找到mask_list,则Original_Values成为NaN该行。如果您需要将其缩放到更多列,只需将它们添加到mask_list和即可val_list。


查看完整回答
反对 回复 2021-04-09
  • 3 回答
  • 0 关注
  • 149 浏览
慕课专栏
更多

添加回答

举报

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