如何根据三列中的顺序将三列合并为一列

时间:2018-12-18 08:54:29

标签: python r merge concat dcast

能给我个建议吗?

我有三栏,例如:

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 个答案:

答案 0 :(得分:1)

您可以使用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')

答案 1 :(得分:0)

as.vector(unlist(t(df)))

这应该可以解决问题。如果您希望按列的结果摆脱t()运算符

修改

对不起,我假设您的列属于dataframe。如果不是这种情况,则可以使用

df=cbind(x,y,z)

答案 2 :(得分:0)

如果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))

答案 3 :(得分:0)

首先堆叠列,然后删除多索引:

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

现在对值进行排序

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

此后,您可以命名该列。

答案 4 :(得分:0)

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

希望这对您有用。

关于, 迪内什·瓦苏(Dinesh Vasu)