2016-07-14 52 views
3

我有一個帶有非唯一索引的熊貓DataFrame,我需要更新其中一行。我可以,如果我可以索引它數值更新該行,如下:使用非唯一索引在Pandas DataFrame中查找並​​更新行

array = np.random.randint(1, 10, (3, 3)) 
df = pd.DataFrame(array, index=['one', 'one', 'two'], columns=['col1', 'col2', 'col3']) 

# df looks like this: 
#  col1 col2 col3 
#one  2  3  6 
#one  3  1  5 
#two  4  5  2 


new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'}) 
df.iloc[0] = new_data 

但如果我不知道的行數?假設我只想設置索引爲「1」的第一行。所以,我想使用.loc找到切片,然後將我的新值賦給第一行。

new_data = pd.Series({'col1': 'new', 'col2': 'new', 'col3': 'new'}) 
df.loc['one'][0] = new_data 

但是,這是使用鏈接索引,這是不是很好。有沒有不同的方式來做到這一點?

回答

1

您可以通過df.iloc[(df.index == 'one').argmax()]訪問它。

所以,你的任務將是這樣的:

df.iloc[(df.index == 'one').argmax()] = new_data 
+0

這確實做什麼,我問,但它是不是很普及。如果我想要索引爲'one'而不是第一行的_last_行,我不能只使用'argmin()'。有沒有更廣泛的方式來做到這一點? –

+0

@JJones是的,創建一個**唯一的**索引。 – piRSquared

+0

@JJones問題是你需要指定一個在匹配的索引組中進行選擇的規則。我挑戰你指定你想要泛化的是什麼?你想要一種通用的方式來抓住特定比賽的第n個?如果是這樣,我會問另一個問題。這個問題確實要求第一個'一個'。 – piRSquared

相關問題