根据条件提取列值

我有以下数据框


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      Open

1      Hold

2     Block

3    Bubble

Name: Original_Values, dtype: object


繁星点点滴滴
浏览 150回答 3
3回答

浮云间

一种方法是使用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'。

元芳怎么了

如何使用前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      Open1      Hold2     Block3    BubbleName: Original_Value, dtype: object

蝴蝶不菲

这是通过一些堆栈进行操作的一种愚蠢的方法,如果堆栈很大df并且需要避免,则可能会更好axis=1。堆叠前三列以创建索引列表,以及该'Original'值对应于哪一列堆叠要从中获取值的列。使用上面的列表为它重新编制索引,以便您返回适当的值。df根据原始行索引将这些值恢复为原始值。这是代码:import remask_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_Values0  Position     Start     Start ...            Open1     Start  Position       End ...            Hold2       End       End  Position ...           Block3  Position    During    During ...          Bubble如果'Position'在中的任何列中未找到mask_list,则Original_Values成为NaN该行。如果您需要将其缩放到更多列,只需将它们添加到mask_list和即可val_list。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python