大熊猫-将具有相同名称和不同缺失数据的多列移动到单列中,然后删除重复的列

时间:2019-12-18 01:23:01

标签: python pandas duplicates missing-data melt

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

Col1  | Col2  | Col1  | Col3  | Col1  | Col4
  a   |   d   |       |   h   |   a   |   p
  b   |   e   |   b   |   i   |   b   |   l
      |   l   |   a   |   l   |       |   a
  l   |   r   |   l   |   a   |   l   |   x
  a   |   i   |   a   |   w   |       |   i
      |   c   |       |   i   |   r   |   c
  d   |   o   |   d   |   e   |   d   |   o

Col1在数据框中重复多次。在每个Col1中,缺少信息。我需要创建一个新列,其中包含每个Col1事件中的所有信息。

如何创建包含完整信息的列,然后删除以前重复的列?

某些信息可能会在多列中丢失。该脚本还打算在将来有一,三,五或任意数量的重复Col1列时使用。

所需的输出如下:

Col2  | Col3  | Col4  | Col5
  d   |   h   |   p   |   a
  e   |   i   |   l   |   b
  l   |   l   |   a   |   a
  r   |   a   |   x   |   l
  i   |   w   |   i   |   a
  c   |   i   |   c   |   r
  o   |   e   |   o   |   d

我一直在查看this question ,但是我不清楚如何才能保持所需的Col1完整值。我可以删除多个相同名称的列,但首先需要创建一个包含完整信息的列。

2 个答案:

答案 0 :(得分:2)

首先用nan替换列中的空值,如下所示:

import numpy as np
df = df.replace(r'^\s*$', np.nan, regex=True)

然后,您可以先使用groupby,然后再使用first()

df.groupby(level = 0, axis = 1).first() 

答案 1 :(得分:0)

可能正是您想要的。

col_list = list(set(df.columns))
dicts={}
for col in col_list:
    val = list(filter(None,set(df.filter(like=col).stack().reset_index()[0].str.strip(' ').tolist())))
    dicts[col]= val
max_len=max([len(k) for k in dicts.values()])
pd.DataFrame({k:pd.Series(v[:max_len]) for k,v in dicts.items()})

输出

   Col3     Col4    Col1    Col2
0   h          i    d       d
1   w          l    b       r
2   i          c    r       i
3   l          x    l       l
4   a          p    a       o
5   e          o    NaN     c
6   NaN        a    NaN     e