2015-12-12 39 views
2

我是Python新手,因此我無法將DataFrame中的一行轉換爲平面list。要做到這一點,我使用下面的代碼:將一個DataFrame行轉換爲平板列表

玩具DataFrame

import pandas as pd 
d = { 
    "a": [1, 2, 3, 4, 5], 
    "b": [9, 8, 7, 6, 5], 
    "n": ["a", "b", "c", "d", "e"] 
} 

df = pd.DataFrame(d) 

我的代碼:

df_note = df.loc[df.n == "d"][["a", "b"]].values #convert to array 
df_note = df_note.tolist() #convert to nested list 
df_note = reduce(lambda x, y: x + y, df_note) #convert to flat list 

對我來說這代碼似乎是毛利率和低效率。在list之前,我將其轉換爲array,這是造成問題的原因,即list被嵌套。經得起考驗,我無法找到將行直接轉換爲列表的方法。有什麼建議?

這個問題不是this的騙局。就我而言,我希望名單是平坦的。

回答

3

你就要成功了,實際上只是使用flatten而不是reduce到UNNEST數組(而不是unnesting列表),以及連鎖經營有一個襯墊:

df.loc[df.n == "d", ['a','b']].values.flatten().tolist() 
#[4, 6] 
1

因爲您選擇了一個子數據框,您將得到一個嵌套列表。

這需要一排,其可以被轉換爲一個列表,而無需壓扁:

df.loc[0, :].values.tolist() 
[1, 9, 'a'] 

如何切片列表:

df_note.values.tolist()[0] 
[4, 6] 

的值被存儲在一個陣列NumPy的。所以你不要轉換它們。熊貓使用了很多NumPy。屬性訪問df_note.values對於數據框的一部分來說只是一個不同的名稱。

1

我假設你明確選擇列ab只是爲了擺脫列n,你只是用來選擇想要的行。

在這種情況下,你也可以使用n列作爲指數第一,使用set_index

>>> dfi = df.set_index('n') 
>>> dfi.ix['d'].tolist() 
[4, 6] 
+0

也許OP具有更多的列,並希望子集只'了'和'B',萬一以上不適用於更通用的數據框。 (但好的方法仍然) –

+0

你是對的,我的回答是基於我對OP做什麼的解釋,因此不那麼通用。我已經編輯了我的答案來澄清這一點。 – Takis