2015-12-12 3 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 

Для меня этот код, как представляется, как грубые и неэффективным. Тот факт, что я конвертирую в array до list, является тем, что вызывает проблему, то есть 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

Я предполагаю, что вы явно выбирая столбцы a и b только для того, чтобы избавиться от столбца n, который вы используете исключительно для выбора нужной строки.

В этом случае, вы можете также использовать n столбец как индекс первой, используя set_index:

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

возможно ОП имеет больше столбцов и хотите подмножество только '' Ā' и b', в случае, выше, не работает на более общем кадре данных. (но хороший подход по-прежнему) –

+0

Вы правы, мой ответ основывался на моей интерпретации того, что OP пытался сделать и, следовательно, был менее общим. Я отредактировал свой ответ, чтобы прояснить это. – Takis

Смежные вопросы