【问题标题】:Splitting DataFrame columns into multiple columns将 DataFrame 列拆分为多列
【发布时间】:2022-01-03 07:59:57
【问题描述】:

我有一个包含 2 列数据的 CSV 文件

Column_1 | Column_2
Data_1   | Data_1
Data_2   | Data_2
Data_3   | Data_3
Data_4   | Data_4
.
.
.

问题是我想重新组织行数,以便在 30 行之后,将创建两个新列,并将其余 30 行的其余部分放入这两个新列中,如下所示:

Column_1 | Column_2 | Column_3 | Column_4
Data_1   | Data_1   | Data_31  | Data_31
Data_2   | Data_2   | Data_32  | Data_32
Data_3   | Data_3   | Data_33  | Data_33
Data_4   | Data_4   | Data_34  | Data_34
.
.
.
Data_30   | Data_30 | Data_60  | Data_60

原因是我的工作场所浪费了太多纸张来打印包含员工使用的所有物品的清单,并且我们需要每 6 个月左右进行一次库存检查,为此,我们必须打印包含所有这些项目的关系,所以我们可以做一个检查清单,他们使用的系统效率不高,因为它还会打印一堆无用的列,其中包含我们简单不需要的数据。我已经制作了一个脚本来将数据清除到 CSV 中,但我现在需要一种方法来使这个 CSV 适合列到右侧,以便我们可以在使用另一张纸来适合更多列进行打印之前尽可能多地适合列。

【问题讨论】:

    标签: python pandas dataframe csv


    【解决方案1】:

    使用 numpy divmod 定义两个辅助列“group”([0, 0, 0, ..., 1, 1, 1, ...])和“index”([0, 1, 2, ..., 0, 1, 2, ...]),然后适当地取消堆叠:

    import numpy as np
    import pandas as pd
    
    df = pd.DataFrame({col: [f"Data_{i}" for i in range(1, 61)] 
                             for col in ["column_1", "column_2"]})
    len_new = 30
    
    df["group"], df["index"] = np.divmod(np.arange(len(df)), len_new)
    df = df.set_index(["group", "index"]).unstack("group").sort_index(axis=1, level=-1)
    df.columns = [f"Column_{icol}" for icol in range(1, 1 + len(df.columns))]
    df
    
    # Out:
          Column_1 Column_2 Column_3 Column_4
    index                                    
    0       Data_1   Data_1  Data_31  Data_31
    1       Data_2   Data_2  Data_32  Data_32
    2       Data_3   Data_3  Data_33  Data_33
    3       Data_4   Data_4  Data_34  Data_34
    4       Data_5   Data_5  Data_35  Data_35
    ...
    

    这将用NaNs 填充最后两列,以防 df 的长度不是组数的倍数。


    解决方案 2: Numpy array_split 和堆栈:

    n_groups = 2 
    pd.DataFrame(np.hstack(np.array_split(df.values, n_groups)), 
                 columns=[f"Column_{i}" for i in range(1, 1 + 2 * n_groups)])
    

    请注意,如果 df 的长度不是 n_groups 的倍数,这将失败,因为 hstack 需要相等的大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 2020-11-10
      • 2017-01-07
      • 2018-05-28
      相关资源
      最近更新 更多