我正在嘗試根據其他 3 列的值來確定列的值。
邏輯是,如果ColC包含字串值 'Deck',則用值 'Deck' 填充新列 ( ColD)。如果沒有,請檢查ColB“Deck”一詞。如果它不存在,請檢查ColA。如果不存在,只需設定ColD為空。
但是,然后我想重復相同的程序,但是對于“梁”這個詞。然后是“墻”這個詞,最后一次是“光柵”這個詞。
這是資料的一個片段:
ColA ColB ColC
Deck DECK PENETRATION
DECK
Deck
WALL PENETRATION
PRIMARY GRATING
Beam PRIMARY BEAM PENE
這就是上面應該最終看起來的樣子:
ColA ColB ColC ColD
Deck DECK PENETRATION Deck
DECK Deck
Deck Deck
WALL PENETRATION Wall
PRIMARY GRATING Grating
Beam PRIMARY BEAM PENE Beam
可能還有其他詞我想根據 ColA-ColC 進行檢查,因此理想情況下,解決方案將涉及將單詞串列傳遞給某種函式。現在的串列看起來像['Deck', 'Beam', 'Wall', 'Grating']
盡管不太可能,但如果代碼發現一列(例如ColA)值包含“Grating”一詞,而另一列(例如ColB)包含“Deck”一詞 - 它只會填充ColD“Conflict”一詞。
我想我可以使用np.where它來做到這一點,但我正在努力設定一些有效的東西。例如,如果代碼檢查單詞“光柵”,并沒有找到它,我不希望它覆寫ColD什么也沒有,它可能已經填充了字Beam,Deck等。
編輯:
因此,如果我與setting結合使用,這樣的事情幾乎可以作業。df.applyaxis = 1
但是,在新列中,它在運行后僅包含值 'Deck' 和 'Unset'。我的邏輯和對apply作業原理的理解有問題。
def my_function(row):
li = ['Deck', 'Grating', 'Wall', 'Beam']
for x in li:
if x.lower() in row.A.lower():
return x
elif x.lower() in row.B.lower():
return x
elif x.lower() in row.C.lower():
return x
else:
return 'unset'
df['ColD'] = df.apply(my_function, axis = 1)
uj5u.com熱心網友回復:
這是一種方法。我更改了您的輸入,以便第一行會導致沖突
import pandas as pd
import io
df = pd.read_csv(io.StringIO(
"""
ColA,ColB,ColC
Deck,DECK PENETRATION, BEAM
,DECK,
Deck,,
,WALL PENETRATION,
,PRIMARY GRATING,
Beam,,PRIMARY BEAM PENE
"""))
df['ColD'] = None
words = ['Deck', 'Beam', 'Wall', 'Grating']
#join the rows together as strings to search through
row_text = df.fillna('').sum(axis=1).str.lower()
for word in words:
contains_inds = row_text.str.contains(word.lower())
inds_to_fill = contains_inds & df['ColD'].isnull()
inds_to_conflict = contains_inds & df['ColD'].notnull()
df.loc[inds_to_fill,'ColD'] = word
df.loc[inds_to_conflict,'ColD'] = 'Conflict'
df
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/376308.html
