ValueError: операнды не могут быть переданы вместе с фигурами в массивах конкатенации между столбцами панд - PullRequest
0 голосов
/ 28 сентября 2018

Я работаю с фреймом данных pandas, который выглядит примерно так:

col1    col2    col3    col_num
0   [-0.20447069290738076, 0.4159556680196389, -0....   [-0.10935000772973974, -0.04425263358067333, -...   [51.0834196, 10.4234469]    3160
1   [-0.42439951483476124, -0.3135960467759942, 0....   [0.3842614765721414, -0.06756644506033657, 0.4...   [45.5643442, 17.0118954]    3159
3   [0.3158755226012898, -0.007057682056994253, 0....   [-0.33158941456615376, 0.09637640660002277, -0...   [50.6402809, 4.6667145] 3157
5   [-0.011089723491692679, -0.01649481399305317, ...   [-0.02827408211098023, 0.00019040943944721592,...   [53.45733965, -2.22695880505223]    3157

Я хотел бы объединить векторы между строками следующим образом: df ['col1'] + df ['col2'] +df ['col3'] + df ['col_num']. transform (лямбда-элемент: [item])

Однако мне выдается следующая ошибка:

/opt/conda/lib/python3.6/site-packages/pandas/core/ops.py in <lambda>(x)
    708                 if is_object_dtype(lvalues):
    709                     return libalgos.arrmap_object(lvalues,
--> 710                                                   lambda x: op(x, rvalues))
    711             raise
    712 

ValueError: operands could not be broadcast together with shapes (30,) (86597,) 

Это похоже напо какой-то причине я застреваю при объединении 3-го столбца, который имеет только 2 измерения.Данные имеют длину 86597 строк.Как я могу исправить эту ошибку?

1 Ответ

0 голосов
/ 28 сентября 2018

Вы можете преобразовать проблемный столбец в list, например:

df['col1'] + df['col2'] + df['col3'].apply(list) + df['col_num'].transform(lambda x: [x])

Другое решение - преобразовать все списки в двумерные массивы и использовать hstack, если длина списков одинакова.в каждом столбце, потому что вы теряете векторизованную функциональность, которая связана с использованием массивов NumPy, хранящихся в смежных блоках памяти:

np.random.seed(123)
N = 10
df = pd.DataFrame({
        "col1": [np.random.randint(10, size=3) for i in range(N)],
        "col2": [np.random.randint(10, size=3) for i in range(N)],
        "col3": [np.random.randint(10, size=2) for i in range(N)],
        'col_num': range(N)
        })
print (df)
        col1       col2    col3  col_num
0  [2, 2, 6]  [9, 3, 4]  [2, 4]        0
1  [1, 3, 9]  [6, 1, 5]  [8, 1]        1
2  [6, 1, 0]  [6, 2, 1]  [2, 1]        2
3  [1, 9, 0]  [8, 3, 5]  [1, 3]        3
4  [0, 9, 3]  [0, 2, 6]  [5, 9]        4
5  [4, 0, 0]  [2, 4, 4]  [0, 8]        5
6  [4, 1, 7]  [6, 3, 0]  [1, 6]        6
7  [3, 2, 4]  [6, 4, 7]  [3, 3]        7
8  [7, 2, 4]  [6, 7, 1]  [5, 9]        8
9  [8, 0, 7]  [5, 7, 9]  [7, 9]        9

a = np.array(df['col1'].values.tolist())
b = np.array(df['col2'].values.tolist())
c = np.array(df['col3'].values.tolist())
#create Nx1 array
d = df['col_num'].values[:, None]

arr = np.hstack((a,b,c, d))
print (arr)
[[2 2 6 9 3 4 2 4 0]
 [1 3 9 6 1 5 8 1 1]
 [6 1 0 6 2 1 2 1 2]
 [1 9 0 8 3 5 1 3 3]
 [0 9 3 0 2 6 5 9 4]
 [4 0 0 2 4 4 0 8 5]
 [4 1 7 6 3 0 1 6 6]
 [3 2 4 6 4 7 3 3 7]
 [7 2 4 6 7 1 5 9 8]
 [8 0 7 5 7 9 7 9 9]]

df = pd.DataFrame(arr)
print (df)
   0  1  2  3  4  5  6  7  8
0  2  2  6  9  3  4  2  4  0
1  1  3  9  6  1  5  8  1  1
2  6  1  0  6  2  1  2  1  2
3  1  9  0  8  3  5  1  3  3
4  0  9  3  0  2  6  5  9  4
5  4  0  0  2  4  4  0  8  5
6  4  1  7  6  3  0  1  6  6
7  3  2  4  6  4  7  3  3  7
8  7  2  4  6  7  1  5  9  8
9  8  0  7  5  7  9  7  9  9
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...