Как я могу объединить три столбца в один столбец в соответствии с порядком в трех столбцах

Не могли бы вы дать мне совет, пожалуйста?

У меня есть три столбца, например:

x     y     z
0.2   0.5   0.26
0.75  0.58  0.25
0.78  0.86  0.95
0.56  0.75  0.52
0.45  0.47  0.57
0.2   0.58  0.98

Результат: И мне нужен только один столбец с этой последовательностью:

    xyz
x1  0.2
y1  0.5
z1  0.26
x2  0.75
y2  0.58
z2  0.25
... 0.78
    0.86
    0.95
    …

Я не нашел подобной проблемы... Большое спасибо. Я пытался использовать "dcast" (R) или "concat" (Python), но я стек.

5 ответов

Решение

Ты можешь использовать pd.melt и создать имена строк, которые вы хотите с np.tile:

m = df.T.melt(value_name='xyz')
rows = np.tile(df.columns, df.shape[0])
m['variable'] = rows.tolist() + (m.variable + 1).astype(str)

    variable   xyz
0        x1  0.20
1        y1  0.50
2        z1  0.26
3        x2  0.75
4        y2  0.58
5        z2  0.25
6        x3  0.78
7        y3  0.86
8        z3  0.95
9        x4  0.56
10       y4  0.75
11       z4  0.52
12       x5  0.45
13       y5  0.47
14       z5  0.57
15       x6  0.20
16       y6  0.58
17       z6  0.98

И если вы хотите, как индекс сделать:

m.set_index('variable')
as.vector(unlist(t(df)))

Это должно сделать свое дело. Если вы хотите, чтобы результат по столбцам избавился от t() оператор

редактировать

Извините, я предположил, что ваши столбцы принадлежат dataframe, Если это не так, вы можете создать его, используя

df=cbind(x,y,z)

Если x, y, z являются объектом списка, вы можете использовать функцию zip для одновременного извлечения элемента из этих списков и использовать функцию перечисления для получения индекса количества в этих списках.

for i, (a, b, c) in enumerate(zip(x, y, z)):
    print("x{} {}".format(i, a))
    print("y{} {}".format(i, b))
    print("z{} {}".format(i, c))

Сначала сложите столбцы, а затем отбросьте мультииндекс:

df2 = df.stack().reset_index(drop=True)

Теперь сортируем значения

print df2.sort_values().reset_index(drop=True)

После этого вы можете назвать колонку.

x <- c(0.2, 0.75, 0.78, 0.56, 0.45, 0.2)
y <- c(0.5, 0.58, 0.86, 0.75, 0.47, 0.58)
z <- c(0.26, 0.25, 0.95, 0.52, 0.57, 0.98)

d <- data.frame(x,y,z)


datalist <- list()
for( i in 1:nrow(d))
{
  m <- d[i,]
  datalist[[i]] <- m
}
output <- unlist(datalist,use.names = F)
output

выход

0.20 0.50 0.26 0.75 0.58 0.25 0.78 0.86 0.95 0.56 0.75 0.52 0.45 0.47 0.57 0.20
0.58 0.98

Надеюсь, это сработает для вас.

С уважением, Динеш Васу

Другие вопросы по тегам