【问题标题】:justify data from right to left从右到左对齐数据
【发布时间】:2020-11-20 05:34:21
【问题描述】:

我有一个包含一系列不同长度整数值的行数据集。我想分隔系列,以便每个整数都有自己的列,但将这些值沿最右边的列对齐。我希望数据框重新识别矩阵的上三角形。

目前我有一个像这样的数据集:

    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 

【问题讨论】:

标签: python pandas dataframe nan series


【解决方案1】:

一种可能的方法是使用Series.str.len 计算max 列中列表的长度valuelmax 然后使用列表推导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

【讨论】:

  • 不错的答案,请查看answer too+1
  • 嘿,谢谢您的解决方案,当我尝试实现它时出现错误提示“操作数无法与形状 (0,) (10,) 一起广播”我不确定这是什么意味着以及如何解决这个问题。
  • 因为我的数组是numpy数组,所以我们修改了代码如:lmax = df['value'].str.len().max() df1 = pd.DataFrame([np.hstack([[np.nan] * (lmax - len(s)), s]) for s in df['value']], columns=range(1, lmax + 1))
【解决方案2】:

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

【讨论】:

  • 我也想过使用np.pad,但我想在这里使用np.pad会增加额外的开销;)。你有什么看法?
  • 是的,使用np.pad 获得预期的输出需要做很多工作。我认为你的更直接:)
  • 是的,当我在这里尝试np.pad 时,我就是这么想的;)。顺便说一句,答案很好 +1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2014-06-03
  • 2014-03-21
相关资源
最近更新 更多