【问题标题】:Combining different columns with overlapping index in pandas将不同的列与熊猫中的重叠索引结合起来
【发布时间】:2018-11-21 10:08:44
【问题描述】:

我有一个看起来像这样的熊猫数据框:

  ABC_1 ABC_2 ABC_3 ABC_4
    x    y       z    k
    NaN  y       NaN  k
    x    NaN      z   NaN
    x    NaN      z   k
    ...  ...     ...  ...

这只是一列ABC,它已被分成许多列。同样,还有其他列,例如PQR,它们已被分成不同的部分。

  • 每列包含100个值(包括NaN),即df的形状在这种情况下可以被认为是(100,4)
  • 我想将所有四列合并为一个名为ABC 的列,但它应该包含所有四列中的所有值。 NaN 值可以在连接之前或之后删除,所以这不是问题,尽管我觉得在连接后一次删除所有 NaNs 会更有效。

简而言之,新列应如下所示:

   ABC
   x
   x
   x
   y
   y
   z
   z
   z
   k
   k
   k
   ...

我尝试了什么:

我尝试使用pd.concat,但它不起作用,因为它抛出了duplicate index error,这从案例中很明显。现在,有一些方法可以解决这个问题,但我认为如果数据框很大,它的计算效率不会很高。

我尝试将所有值放入一个列表中,然后将其分配给新数据框的列,但正如我所说,数据框可能很大,列表会占用大量空间。

谁能告诉我如何有效地做到这一点?

编辑:可能还有一种情况。不必所有列名都遵循相同的模式。例如上面的数据框也包含这样的列

ABC_1 ABC_2 ABC_3 ABC_4 ABC_5_patt
    x    y       z    k    p
    NaN  y       NaN  k    p
    x    NaN      z   NaN  p
    x    NaN      z   k    NaN
    ...  ...     ...  ...  ...

【问题讨论】:

    标签: python python-3.x pandas dataframe data-analysis


    【解决方案1】:

    使用unstackdropna 并删除MultiIndex reset_index,最后一个to_frame 将Series 转换为一列DataFrame

    df = df.unstack().dropna().reset_index(drop=True).to_frame('ABC')
    print (df)
       ABC
    0    x
    1    x
    2    x
    3    y
    4    y
    5    z
    6    z
    7    z
    8    k
    9    k
    10   k
    

    如果可能的话,多个类别:

    print (df)
      ABC_1 PQR_2 ABC_3 PQR_4
    0     x     y     z     k
    1   NaN     y   NaN     k
    2     x   NaN     z   NaN
    3     x   NaN     z     k
    
    df.columns = df.columns.str.split('_', expand=True)
    df = df.unstack().dropna().reset_index(level=[1,2],drop=True)
    df.index = [df.groupby(level=0).cumcount(), df.index]
    df = df.unstack()
    print (df)
      ABC  PQR
    0   x    y
    1   x    y
    2   x    k
    3   z    k
    4   z    k
    5   z  NaN
    

    【讨论】:

    • 如果其他列包含类似PQR_4_text的模式怎么办?
    • @mlRocks - 你能解释更多吗?主要看数据。
    • 当然。例如,在_ 上拆分后,所有列不一定只包含两个值。您给出的上述示例中的列之一可能是PQR_4_text,而不仅仅是PQR_4
    • @mlRocks - 你能添加数据样本和预期输出吗?
    • @mlRocks - 我看到了你的编辑,所以需要df.columns = df.columns.str.split('_', expand=True, n=1) 来获得第二个解决方案吗?
    【解决方案2】:
    import numpy as np
    x = {"ABC_1": [1, np.nan, 2], "ABC_2": [3, 4, np.nan]}
    df = pd.DataFrame(x)
    

    这就是df 的样子:

       ABC_1  ABC_2
    0    1.0    3.0
    1    NaN    4.0
    2    2.0    NaN
    

    你可以像这样创建一个系列:

    s = pd.concat([df[col] for col in df.columns])
    s = s[s.notnull()] 
    

    这是s 的样子:

    0    1.0
    2    2.0
    0    3.0
    1    4.0
    

    如果需要,您可以重新索引s

    【讨论】:

      猜你喜欢
      • 2017-05-17
      • 2020-03-30
      • 2021-07-31
      • 2012-08-18
      • 2018-06-17
      • 2019-09-19
      • 2016-05-04
      • 2021-09-01
      • 2023-01-30
      相关资源
      最近更新 更多