将nColumn重新打包为3列

2024-04-26 14:33:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个这样的数据帧(第一行是索引号):

0      1      2      3       4       5       6        7       8

66     56     34     40     41      55       80      None     None
90     91     12     44     89      60       11      45       60
10     20     49     90     33      40       67      55       None
.
.

作为输出,我需要取每3个值,忽略任何无值并将其重新打包到一行,如下所示:

0       1         2 

66      56        34
40      41        55
80      90        91
12      44        89
60      11        45
60      10        20
49      90        33
40      67        55

有没有一种简单的方法来旋转和堆叠它呢?你知道吗


Tags: 数据方法none个值无值
3条回答

Python仙尘

pd.DataFrame([*zip(*[iter(df.stack())] * 3)])

      0     1     2
0  66.0  56.0  34.0
1  40.0  41.0  55.0
2  80.0  90.0  91.0
3  12.0  44.0  89.0
4  60.0  11.0  45.0
5  60.0  10.0  20.0
6  49.0  90.0  33.0
7  40.0  67.0  55.0

怎么了。。。是吗?

  • df.stack()将2Ddf转换为1D序列,同时删除空值
  • [iter(df.stack())] * 3在一个列表[]中创建一个iter对象(它可以并且将被耗尽),然后将它乘以3。这将创建一个长度为3的列表,其中所有3个元素都指向相同的iter对象。这样做的结果是,当我在第一个位置遍历该对象时,它会耗尽该对象的剩余位置。你知道吗
  • 当Izip这3个元素组合在一起时,它具有按3分组的效果
  • 剩下的就是把它放到数据帧构造函数中

numpy使用reshape

s=np.concatenate(df.values)
pd.DataFrame(s[s!='None'].reshape(-1,3))
Out[1345]: 
    0   1   2
0  66  56  34
1  40  41  55
2  80  90  91
3  12  44  89
4  60  11  45
5  60  10  20
6  49  90  33
7  40  67  55

首先,我们可以使用ravel将所有值转换为平面数组,然后过滤掉Nonereshape

x = df.values.ravel()
x[x != None].reshape(-1,3)  # pd.DataFrame(x[x != None].reshape(-1,3))
                            # if you want to have a DataFrame instead of
                            # numpy array

输出:

array([[66., 56., 34.],
       [40., 41., 55.],
       [80., 90., 91.],
       [12., 44., 89.],
       [60., 11., 45.],
       [60., 10., 20.],
       [49., 90., 33.],
       [40., 67., 55.]])

相关问题 更多 >