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
我有一个如下所示的数据框:
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