Удалить элемент из каждого списка в столбце в панде DataFrame - PullRequest
0 голосов
/ 02 октября 2018

У меня довольно простой вопрос, но у меня проблемы с достижением того, чего я хочу.У меня есть DataFrame, который выглядит следующим образом:

base
[a,b,c]
[c,d,e]
[a,b,h]

Я хочу удалить второй элемент каждого списка, поэтому я бы получил это:

base
[a,c]
[c,e]
[a,h]

Я полагаю, есть простой способчтобы сделать это, но это не совсем обычная работа со списками в DataFrames, поэтому я ничего не нахожу.

Заранее спасибо.

Редактировать: DataFrame это только один столбец, которыйсостоит из списков одинаковой длины.Мне нужно удалить один элемент, поэтому длина списка равна количеству столбцов в кадре данных, которым он станет.

Ответы [ 4 ]

0 голосов
/ 02 октября 2018

Вы можете использовать df['base'].apply(lambda x: x.pop(1)).Обратите внимание, что pop действует на месте, поэтому вам не нужно присваивать результат base (фактически, если вы это сделаете, вы получите удаленный элемент вместо оставшегося списка).

Однако, как говорит @jpp, вам следует рассмотреть возможность использования какой-либо другой структуры данных, например, фрейма данных с многоиндексным или трехмерным массивом пустышек.

И, учитывая ваше редактирование, вероятно, легче конвертироватьданные в фрейм данных с несколькими столбцами, а затем удалите дополнительный столбец, вместо того, чтобы пытаться манипулировать столбцом списков, а затем превратить его в окончательный кадр данных.Может показаться, что проще иметь «только один столбец», но вы просто помещаете дополнительную сложность в отдельный слой, а не избавляетесь от него.Pandas построен на основе двумерных данных, представленных в виде столбцов и строк, а не в виде одного столбца списков, поэтому вы стараетесь не использовать инструменты, которые были созданы для обеспечения pandas.

Предположительно, у вас было что-то вроде этого:

data=[['a','b','c'],
['c','d','e'],
['a','b','h']]

И вы сделали что-то вроде этого:

df = pd.DataFrame({'base':data})

Вместо этого вы должны сделать

df = pd.DataFrame(data)
df = df[[0,2]]
0 голосов
/ 02 октября 2018

IIUC

df.base=pd.DataFrame(df.base.values.tolist()).drop(1,1).values.tolist()
df
Out[635]: 
     base
0  [a, c]
1  [c, e]
2  [a, h]
0 голосов
/ 02 октября 2018

Вы можете работать с базовым np.array:

df['base'] = np.stack(df.base.values)[:,[0,2]].tolist()

>>> df
     base
0  [a, c]
1  [c, e]
2  [a, h]
0 голосов
/ 02 октября 2018

Не используйте list в серии

Панды серии не предназначены для хранения списков.Вы теряете всю функциональность и производительность с двумя слоями указателей: один с вашим массивом object dtype, другой соответствует каждому списку в вашей серии.

Поскольку каждый список имеет одинаковое количество элементов, вместо этого разделите их на столбцы:

df = pd.DataFrame({'base': [list('abc'), list('cde'), list('abh')]})

res = pd.DataFrame(df['base'].values.tolist()).iloc[:, [0, 2]]

print(res)

   0  2
0  a  c
1  c  e
2  a  h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...