在熊猫中将不同的列与重叠的索引结合起来

时间:2018-11-21 10:08:45

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

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

  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个值(包括NaNs),即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
    ...  ...     ...  ...  ...

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

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