pandas 垂直组合柱

htrmnn0y  于 9个月前  发布在  其他
关注(0)|答案(2)|浏览(81)

我是一个绝对的初学者。我正在尝试垂直地合并组合列。我想以一种方式将列1、5和9的数据都放在同一列中。但我很难做到这一点。

columns_1_to_4 = df.iloc[0:9, 0:4]
    columns_5_to_8 = df.iloc[0:9, 4:8]
    columns_9_to_12 = df.iloc[0:9, 8:12]

    new_df = pd.concat([columns_1_to_4, columns_5_to_8, columns_9_to_12], axis=0).ffill(axis=1)

字符串
我尝试了ffill(axis=1)的所有三个块以及new_df,但我只是无法从原始列移动数据。我感谢任何帮助。非常感谢提前。

e4eetjau

e4eetjau1#

问题是您的列具有不同的名称:

>>> df
    A   B   C   D    E    F    G    H    I    J    K    L
0   0   1   2   3    4    5    6    7    8    9   10   11
1  12  13  14  15   16   17   18   19   20   21   22   23
2  24  25  26  27   28   29   30   31   32   33   34   35
3  36  37  38  39   40   41   42   43   44   45   46   47
4  48  49  50  51   52   53   54   55   56   57   58   59
5  60  61  62  63   64   65   66   67   68   69   70   71
6  72  73  74  75   76   77   78   79   80   81   82   83
7  84  85  86  87   88   89   90   91   92   93   94   95
8  96  97  98  99  100  101  102  103  104  105  106  107

字符串
所以(A,B,C,D)与(E,F,G,H)和(I,J,K,L)不同,所以pandas不能堆叠你的列,因为索引没有对齐。一个简单的方法是使用numpy来重塑你的列框:

# .iloc[:9, :12] is not mandatory if it's your whole dataframe
data = df.iloc[:9, :12].values.reshape(-1, 4)
out = pd.DataFrame(data, columns=list('ABCD'))


输出量:

>>> out
      A    B    C    D
0     0    1    2    3
1     4    5    6    7
2     8    9   10   11
3    12   13   14   15
4    16   17   18   19
5    20   21   22   23
6    24   25   26   27
7    28   29   30   31
8    32   33   34   35
9    36   37   38   39
10   40   41   42   43
11   44   45   46   47
12   48   49   50   51
13   52   53   54   55
14   56   57   58   59
15   60   61   62   63
16   64   65   66   67
17   68   69   70   71
18   72   73   74   75
19   76   77   78   79
20   80   81   82   83
21   84   85   86   87
22   88   89   90   91
23   92   93   94   95
24   96   97   98   99
25  100  101  102  103
26  104  105  106  107

lqfhib0f

lqfhib0f2#

除了 @Corralien 的答案,这里是如何修复你的代码/mis-alignment

dfs = [columns_1_to_4, columns_5_to_8, columns_9_to_12]
# or maybe [df.iloc[:9, i:i+4] for i in range(0, 12, 4)] ?

new_cols = None # you can choose to set any cols you want

new_df = pd.concat(
    map(lambda df_: pd.DataFrame(
        df_.to_numpy(), columns=new_cols), dfs)
)

字符串

相关问题