Подтвердить что ты не робот

Python pandas вставить список в ячейку

У меня есть список 'abc' и dataframe 'df':

abc = ['foo', 'bar']
df =
    A  B
0  12  NaN
1  23  NaN

Я хочу вставить список в ячейку 1B, поэтому мне нужен этот результат:

    A  B
0  12  NaN
1  23  ['foo', 'bar']

Хо я могу это сделать?

1) Если я использую это:

df.ix[1,'B'] = abc

Появляется следующее сообщение об ошибке:

ValueError: Must have equal len keys and value when setting with an iterable

потому что он пытается вставить список (имеющий два элемента) в строку/столбец, но не в ячейку.

2) Если я использую это:

df.ix[1,'B'] = [abc]

то он вставляет список, в котором есть только один элемент, который является списком 'abc' ([['foo', 'bar']]).

3) Если я использую это:

df.ix[1,'B'] = ', '.join(abc)

то он вставляет строку: (foo, bar), но не список.

4) Если я использую это:

df.ix[1,'B'] = [', '.join(abc)]

то он вставляет список, но он имеет только один элемент (['foo, bar']), но не два, как я хочу (['foo', 'bar']).

Спасибо за помощь!


ИЗМЕНИТЬ

Мой новый фрейм данных и старый список:

abc = ['foo', 'bar']
df2 =
    A    B         C
0  12  NaN      'bla'
1  23  NaN  'bla bla'

Другой информационный кадр:

df3 =
    A    B         C                    D
0  12  NaN      'bla'  ['item1', 'item2']
1  23  NaN  'bla bla'        [11, 12, 13]

Я хочу вставить список 'abc' в df2.loc[1,'B'] и/или df3.loc[1,'B'].

Если в dataframe есть столбцы только с целыми значениями и/или значениями NaN и/или значениями списка, тогда вставка списка в ячейку работает отлично. Если в dataframe есть столбцы только со строковыми значениями и/или значениями NaN и/или значениями списка, тогда вставка списка в ячейку работает отлично. Но если в dataframe есть столбцы с целыми и строковыми значениями и другими столбцами, тогда появляется сообщение об ошибке, если я использую это: df2.loc[1,'B'] = abc или df3.loc[1,'B'] = abc.

Другой информационный кадр:

df4 =
          A     B
0      'bla'  NaN
1  'bla bla'  NaN

Эти вставки отлично работают: df.loc[1,'B'] = abc или df4.loc[1,'B'] = abc.

4b9b3361

Ответ 1

df3.set_value(1, 'B', abc) работает для любого фрейма данных. Позаботьтесь о типе данных столбца "B". Например. список не может быть вставлен в столбец с плавающей точкой, в этом случае df['B'] = df['B'].astype(object) может помочь.

Ответ 2

Поскольку set_value устарело с версии 0.21.0, теперь вы должны использовать at. Он может вставить список в ячейку без ValueError как это делает loc. Я думаю, это потому, что at всегда ссылается на одно значение, а loc может ссылаться на значения, а также на строки и столбцы.

df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})

df.at[1, 'B'] = ['m', 'n']

df =
    A   B
0   1   x
1   2   [m, n]
2   3   z

Ответ 3

v0. 23+, set_value устарела.
Теперь вы можете использовать DataFrame.at для установки по метке, а DataFrame.iat для установки по целочисленной позиции.


Установка значений ячеек с помощью at/ iat

# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df

    A       B
0  12  [a, b]
1  23  [c, d]

df.dtypes

A     int64
B    object
dtype: object

Если вы хотите установить значение во второй строке "B" для нового списка, используйте DataFrane.at:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

Вы также можете установить целочисленную позицию, используя DataFrame.iat

df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

Что если я получу ValueError: setting an array element with a sequence?

Я постараюсь воспроизвести это с:

df

    A   B
0  12 NaN
1  23 NaN

df.dtypes

A      int64
B    float64
dtype: object

df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.

Это связано с тем, что ваш объект имеет тип float64 d, тогда как списки являются object s, так что здесь есть несоответствие. В этой ситуации вам нужно сначала преобразовать столбец в объект.

df['B'] = df['B'].astype(object)
df.dtypes

A     int64
B    object
dtype: object

Тогда это работает:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12     NaN
1  23  [m, n]

Возможно, но хаки

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

df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df

    A             B
0  12        [a, b]
1  23  [m, n, o, p]

Вы можете прочитать больше о том, почему это работает здесь.

Ответ 5

Быстрая работа вокруг

Просто заключите список в новый список, как это было сделано для col2 во фрейме данных ниже. Причина, по которой он работает, заключается в том, что python берет внешний список (списков) и преобразует его в столбец, как если бы он содержал обычные скалярные элементы, которые в нашем случае являются списками, а не обычными скалярами.

mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data


   col1     col2
0   1       [1, 4]
1   2       [2, 5]
2   3       [3, 6]