如何根据三列中的顺序将三列合并为一列
How can I merge three columns into one column according to the order of in the three columns
你能给我一个建议吗?
我有三列,e.x.:
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) 但我是堆栈。
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))
您可以使用 pd.melt
and create the row names you want with 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')
先堆叠列,然后删除多索引:
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
希望这对你有用。
此致,
迪内什·瓦苏
你能给我一个建议吗?
我有三列,e.x.:
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) 但我是堆栈。
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))
您可以使用 pd.melt
and create the row names you want with 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')
先堆叠列,然后删除多索引:
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
希望这对你有用。
此致, 迪内什·瓦苏