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