Добавление элемента в список в указанной строке данных - PullRequest
0 голосов
/ 11 марта 2019

Итак, у меня есть это:

df = pd.DataFrame({'array': [[], [], []]})

# need to add an element in index 0
df[df.index==0].array[0].append(1) # works! add 1 to first row

df[df.index==1].array[0].append(2) # doesnt work!
df[df.index==1].array[1].append(2) # works! add 2 to second row
df.array[3].append(10) # works! add 10 to 3rd row

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

df[df.index>0].array.append(2) # obviously does not work

[Объяснение]

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

# This was how I created it
df = pd.DataFrame({'array': 3 * [[]]})

# It gives different result than this method:
df = pd.DataFrame({'array': [[] for i in range(3)]

# Or this method:
df = pd.DataFrame({'array': [[], [], []] })

Помимо этого, я понял, что это довольно похоже.Ответы здесь дают больше объяснений, чем в связанной ветке.Надеюсь, этот вопрос может остаться.Дайте мне знать, если мне нужно удалить эту ветку, так как я хочу сохранить все ответы и предложения от людей здесь.

Ответы [ 5 ]

2 голосов
/ 11 марта 2019

Когда вы звоните df[df.index==1], вы получаете следующее:

1    []
Name: array, dtype: object

Обратите внимание на число 1 - вы нарезаете индекс, так что имеет смысл, когда вы пытаетесьчтобы получить к нему доступ:

df[df.index==1].array[0]

Он пытается получить элемент zeroth , которого там нет.По этой и другим причинам pandas предоставляет iloc и loc.Следующее выполняется и результаты, как и ожидалось:

df = pd.DataFrame({'array': [[], [], []]})
df.iloc[0].array.append(0)
df.iloc[1].array.append(2)
df.iloc[0].array.append(0)
df.iloc[1].array.append(2)
1 голос
/ 11 марта 2019

Отчасти проблема в том, что вы пытаетесь получить доступ к индексам, которые на самом деле не существуют, поэтому вам нужно быть уверенным, что они есть. Чтобы добавить свой массив, вы можете использовать iloc или iat, последний, как правило, рекомендуется для доступа к индексам целым числом:

import pandas as pd

df = pd.DataFrame({'array': [[], [], []]})

# need to add an element in index 0
df.iat[0,0].append(1)  # works! add 1 to first row
df.iat[1,0].append(2)  # works! add 2 to second row
df.iat[1,0].append(2)  # works! add another 2 to second row
df.iat[2,0].append(10) # works! add 10 to 3rd row

Результат:

    array
0     [1]
1  [2, 2]
2    [10]

iat
Доступ к одному значению для пары строка / столбец по целочисленной позиции. Подобно iloc , в котором оба обеспечивают поиск на основе целых чисел. Используйте iat , если вам нужно только получить или установить одно значение в DataFrame или Series.

pandas.DataFrame.iat

1 голос
/ 11 марта 2019

Можно по-прежнему использовать .loc

df.loc[df.index < 2, 'array'] = df.loc[df.index < 2, 'array'] + [4]

#  array
#0   [4]
#1   [4]
#2    []

Хотя это не быстрее, чем медленное применение.Как правило, именно поэтому вы не храните list объектов в DataFrame.

1 голос
/ 11 марта 2019

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

Панды используют «нормальные» имена методов для работыо последовательностях, ссылающихся на фактический кадр данных Pandas .Таким образом, вы не можете просто сделать a[i].append так же, как вы сделали бы a[i] *= 2.: - (

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

h[1] >>> print(f)
  array
0    []
1    []
2    []
h[1] >>> f[f.index>0].array.apply([2].__add__)
1    [2]
2    [2]
Name: array, dtype: object
1 голос
/ 11 марта 2019
for x in df[df.index>0].array:
    x.append(2)

df[df.index>0].array.append(2) не работает, потому что df[df.index>0].array возвращает серию списков, поэтому мы должны перечислить эту серию и вставить в каждый список.

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