Как установить все элементы одного столбца данных в массивы? - PullRequest
1 голос
/ 22 марта 2019

Я просто хочу знать, как установить все элементы одного столбца данных в массивах в Pandas.

Точно так же, столбец один и два

  a b c d   one    two
0 1 2 3 4 [1, 2] [1, 2]
1 2 2 3 4 [2, 2] [2, 2]
2 3 2 3 4 [3, 2] [3, 2]

Я пытался,но только так:

d['one']=[[1,2],[2,2],[3,2]]

И если я хочу использовать массив Numpy вместо встроенного массива Python, например:

d['one']=np.array([[1,2],[2,2],[3,2]])

Это значит:

  a b c d one  two
0 1 2 3 4  1 [1, 2]
1 2 2 3 4  2 [2, 2]
2 3 2 3 4  3 [3, 2]

Или я хочу установить столбец для одного и того же массива одновременно, например,

d['one']=[1,2], or d['c']=[1,2]

Примерно так:

  a b c d   one    two
0 1 2 3 4 [1, 2] [1, 2]
1 2 2 3 4 [1, 2] [2, 2]
2 3 2 3 4 [1, 2] [3, 2]

Имеется ошибка:

ValueError: длина значений не соответствует длине индекса

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

d['b']=[[1,2],[6,7],[6,7]]

, за один раз.Мне нужно сделать это шаг за шагом.

Например, сначала установите для столбца b значение [1,2], где a = 1,

d.loc[d['a']==1,'b']=[1,2]
  a     b c d   one    two
0 1 [1,2] 3 4 [1, 2] [1, 2]
1 2     2 3 4 [2, 2] [2, 2]
2 3     2 3 4 [3, 2] [3, 2]

Затем установите для столбца b значение [6,7], [6,7] где a = 2 или a = 3,

d.loc[(d['a']==2)|(d['a']==3),'b']=[6,7]
  a    b  c d   one    two
0 1 [1,2] 3 4 [1, 2] [1, 2]
1 2 [6,7] 3 4 [2, 2] [2, 2]
2 3 [6,7] 3 4 [3, 2] [3, 2]

В первом ошибка:

Должны иметь равные ключи и значение lenпри установке с итерацией

Если я делаю это по-другому:

d['b'][0]=[1,2]

Также ошибка:

ValueError: установка элемента массива споследовательность.

И последний приходит к:

  a b c d   one    two
0 1 2 3 4 [1, 2] [1, 2]
1 2 6 3 4 [2, 2] [2, 2]
2 3 7 3 4 [3, 2] [3, 2]

, что не я хочу, так как написать, чтобы добиться этого эффекта?

Подводя итог,

  1. Как я могу использовать массив numpy для достижения этой цели?Как я могу установить для столбца один и тот же массив одновременно?

  2. Как изменить значения столбца на массивы в соответствии с условиями?

1 Ответ

0 голосов
/ 22 марта 2019

Воспроизведение вашего примера:

С учетом кадра данных:

>> d = pd.DataFrame({'a': [1, 2, 3],
>>                   'b': [2, 2, 2],
>>                   'c': [3, 3, 3],
>>                   'd': [4, 4, 4]})

Код, который вы протестировали, генерирует список списков, а фрейм данных интерпретируется как каждый список как значение для строки:

>> d['one']=[[1,2],[2,2],[3,2]]
>> print(d['one'][0])
>> print(type(d['one'][0]))
[1, 2]
<class 'list'>

Теперь сохраняем массив numpy.array в кадре данных:

Если вы построите список массивов, вы сможете хранить его по своему усмотрению:

>> two = [np.array([1,2]), np.array([2,2]),np.array([3,2])]
>> d['two']= two
>> print(d['two'][0])
>> print(type(d['two'][0]))
[1 2]
<class 'numpy.ndarray'>

Чтобы упростить эту операцию, вы можете использовать функцию лямбда / применить:

>> d['three'] = [[1,2],[2,2],[3,2]]
>> d['three'] = d['three'].apply(lambda x: tuple(x)).apply(np.array)
>> print(d['three'][0])
>> print(type(d['three'][0]))
[1 2]
<class 'numpy.ndarray'>

Чтобы получить данные, как вы описали

Чтобы проверить, соответствует ли первое value == 3 или столбец three массива условию, также используется лямбда / apply:

d[d.apply(lambda x: x['three'][0] == 3, axis=1)]
    a   b   c   d   one two three
2   3   2   3   4   [3, 2]  [3, 2]  [3, 2] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...