3 回答

TA貢獻1829條經(jīng)驗 獲得超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()函數(shù)被調(diào)用一次,數(shù)據(jù)幀中的每一行。
請注意'',當所有列均不匹配單詞時,它將使用空字符串的默認值'Position'。

TA貢獻1798條經(jīng)驗 獲得超7個贊
如何使用前3個cols創(chuàng)建遮罩(或指定它們的名稱)并將其與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條經(jīng)驗 獲得超4個贊
這是通過一些堆棧進行操作的一種愚蠢的方法,如果堆棧很大df
并且需要避免,則可能會更好axis=1
。
堆疊前三列以創(chuàng)建索引列表,以及該
'Original'
值對應于哪一列堆疊要從中獲取值的列。使用上面的列表為它重新編制索引,以便您返回適當?shù)闹怠?/p>
df
根據(jù)原始行索引將這些值恢復為原始值。
這是代碼:
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 就是現(xiàn)在:
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。
添加回答
舉報