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'。
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
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。
添加回答
举报