我有一个看起来像这样的数据框:
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
完整值。我可以删除多个相同名称的列,但首先需要创建一个包含完整信息的列。
答案 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