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

pandas - move multiple columns with the same name and different missing data into single column then delete duplicate columns

我有一个如下所示的数据框:

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 具有完整的值。我可以删除多个同名列,但我需要先创建一个包含完整信息的列。

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

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

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

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

可能这就是您要找的东西。

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