从右到左对齐数据



我有一个行数据集,其中包含一个系列中不同长度的整数值。我想将序列分开,这样每个整数都有自己的列,但将这些值沿最右边的列对齐。我希望数据帧重新生成矩阵的上三角。

目前我有一个数据集,如:

variable    value
0   0   [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
1   1   [1, 2, 3, 4, 5, 6, 7, 8, 9]
2   2   [1, 2, 3, 4, 5, 6, 7, 8]
3   3   [1, 2, 3, 4, 5, 6, 7]
4   4   [1, 2, 3, 4, 5, 6]
5   5   [1, 2, 3, 4, 5]
6   6   [1, 2, 3, 4]
7   7   [1, 2, 3]
8   8   [1, 2]
9   9   [1]

我应用这个功能

df = pd.DataFrame([pd.Series(x) for x in df2.value])
df.columns = ['{}'.format(x+1) for x in df.columns]

我得到这个:

1   2   3   4   5   6   7   8   9   10
0   1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 0.0
1   1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 NaN
2   1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 NaN NaN
3   1.0 2.0 3.0 4.0 5.0 6.0 7.0 NaN NaN NaN
4   1.0 2.0 3.0 4.0 5.0 6.0 NaN NaN NaN NaN
5   1.0 2.0 3.0 4.0 5.0 NaN NaN NaN NaN NaN
6   1.0 2.0 3.0 4.0 NaN NaN NaN NaN NaN NaN
7   1.0 2.0 3.0 NaN NaN NaN NaN NaN NaN NaN
8   1.0 2.0 NaN NaN NaN NaN NaN NaN NaN NaN
9   1.0 NaN NaN NaN NaN NaN NaN NaN NaN NaN

但我想要的是:

1   2   3   4   5   6   7   8   9   10
0   1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 0.0
1   NaN 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 9.0 
2   NaN NaN 1.0 2.0 3.0 4.0 5.0 6.0 7.0 8.0 
3   NaN NaN NaN 1.0 2.0 3.0 4.0 5.0 6.0 7.0 
4   NaN NaN NaN NaN 1.0 2.0 3.0 4.0 5.0 6.0 
5   NaN NaN NaN NaN NaN 1.0 2.0 3.0 4.0 5.0 
6   NaN NaN NaN NaN NaN NaN 1.0 2.0 3.0 4.0
7   NaN NaN NaN NaN NaN NaN NaN 1.0 2.0 3.0 
8   NaN NaN NaN NaN NaN NaN NaN NaN 1.0 2.0 
9   NaN NaN NaN NaN NaN NaN NaN NaN NaN 1.0 

一种可能的方法是使用Series.str.len来计算列value中列表的max长度,即lmax,然后使用列表理解pad基于lmax:

lmax = df['value'].str.len().max()
df1 = pd.DataFrame([[np.nan] * (lmax - len(s)) + s
for s in df['value']], columns=range(1, lmax + 1))

结果:

print(df1)
1    2    3    4    5    6    7    8    9  10
0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0   0
1  NaN  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0   9
2  NaN  NaN  1.0  2.0  3.0  4.0  5.0  6.0  7.0   8
3  NaN  NaN  NaN  1.0  2.0  3.0  4.0  5.0  6.0   7
4  NaN  NaN  NaN  NaN  1.0  2.0  3.0  4.0  5.0   6
5  NaN  NaN  NaN  NaN  NaN  1.0  2.0  3.0  4.0   5
6  NaN  NaN  NaN  NaN  NaN  NaN  1.0  2.0  3.0   4
7  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  2.0   3
8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0   2
9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   1

您也可以使用np.pad,但需要先将每个数组的dtype强制转换为float才能填充nan:

s = pd.DataFrame([np.pad(np.array(a).astype(float), (10 - len(a), 0), mode="constant",
constant_values=np.NaN) for a in df["value"]])
print (s)
0    1    2    3    4    5    6    7    8     9
0  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0  9.0  10.0
1  NaN  1.0  2.0  3.0  4.0  5.0  6.0  7.0  8.0   9.0
2  NaN  NaN  1.0  2.0  3.0  4.0  5.0  6.0  7.0   8.0
3  NaN  NaN  NaN  1.0  2.0  3.0  4.0  5.0  6.0   7.0
4  NaN  NaN  NaN  NaN  1.0  2.0  3.0  4.0  5.0   6.0
5  NaN  NaN  NaN  NaN  NaN  1.0  2.0  3.0  4.0   5.0
6  NaN  NaN  NaN  NaN  NaN  NaN  1.0  2.0  3.0   4.0
7  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0  2.0   3.0
8  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  1.0   2.0
9  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN  NaN   1.0

最新更新