Python 如何根据是否存在另一组列来创建新列
我的问题如下: 我有一个数据帧Python 如何根据是否存在另一组列来创建新列,python,pandas,pandas-groupby,filtering,multiple-columns,Python,Pandas,Pandas Groupby,Filtering,Multiple Columns,我的问题如下: 我有一个数据帧df,它有5列,比如('a','B','C','D','E') 现在,我希望根据这些列在集合中的列来组合这些列,例如GP1=['A','B','D']和GP2=['C','E'],并根据它们创建两个新列 df['Group1'] = df[GP1].min(axis=1) df['Group2'] = df[GP2].max(axis=1) 然而,根据数据,可能很多时候第一组数据中缺少列“A”(或说“D”或“B”或可能全部),或者第二组数据中缺少
df
,它有5列,比如('a','B','C','D','E')
现在,我希望根据这些列在集合中的列来组合这些列,例如GP1=['A','B','D']
和GP2=['C','E']
,并根据它们创建两个新列
df['Group1'] = df[GP1].min(axis=1)
df['Group2'] = df[GP2].max(axis=1)
然而,根据数据,可能很多时候第一组数据中缺少列“A”(或说“D”或“B”或可能全部),或者第二组数据中缺少列“C”或“E”(或两者)
因此,我想做的是,代码将检查第一个集合或第二个集合中的任何列是否丢失,然后仅创建新的“Group1”或“Group2”,如果一个集合中存在所有列,并且如果任何集合中的任何列丢失,则将跳过创建新列。
我怎样才能做到这一点。我在尝试循环,但没有帮助,并成为复杂的逻辑
两个集合中的所有列都存在时的示例:
df_in
A B C D E
1 2 3 4 5
2 4 6 2 3
1 0 2 4 2
df_out
A B C D E Group1 Group2
1 2 3 4 5 1 5
2 4 6 2 3 2 6
1 0 2 4 2 0 2
例如,如果第二组中的E列不存在:
df_in
A B C D
1 2 3 4
2 4 6 2
1 0 2 4
df_out
A B C D Group1
1 2 3 4 1
2 4 6 2 2
1 0 2 4 0
当集合A中缺少A和D时(集合/组1中只有B)
当集合1中的A缺失且集合2中的C缺失时,出现以下情况:
df_in
B D E
2 4 5
4 2 3
0 4 2
df_out
B D E
2 4 5
4 2 3
0 4 2
在这方面的任何帮助都将不胜感激。谢谢给你,我想你可以用这个:
df_out = (df_in.assign(Group1=df_in.reindex(gp1, axis=1).dropna().min(axis=1),
Group2=df_in.reindex(gp2, axis=1).dropna().max(axis=1))
.dropna(axis=1, how='all'))
MCVE:
谢谢Haleemur&Trenton。添加了详细的示例输入/输出组合。谢谢again@HaleemurAli由于增加了一个具有当前和预期结果的投票,我错误地撤回了我的接近票。对不起,我的错。极好的解决方案。谢谢你,斯科特!
df_out = (df_in.assign(Group1=df_in.reindex(gp1, axis=1).dropna().min(axis=1),
Group2=df_in.reindex(gp2, axis=1).dropna().max(axis=1))
.dropna(axis=1, how='all'))
df_in = pd.read_clipboard() #Read from copy of df_in in the question above
print(df_in)
# A B C D E
# 0 1 2 3 4 5
# 1 2 4 6 2 3
# 2 1 0 2 4 2
gp1 = ['A','B','D']
gp2 = ['C','E']
df_out = (df_in.assign(Group1=df_in.reindex(gp1, axis=1).dropna().min(axis=1),
Group2=df_in.reindex(gp2, axis=1).dropna().max(axis=1))
.dropna(axis=1, how='all'))
print(df_out)
# A B C D E Group1 Group2
# 0 1 2 3 4 5 1 5
# 1 2 4 6 2 3 2 6
# 2 1 0 2 4 2 0 2
df_in_copy=df_in.copy() #make a copy to reuse later
df_in = df_in.drop('E', axis=1) #Drop Col E
print(df_in)
# A B C D
# 0 1 2 3 4
# 1 2 4 6 2
# 2 1 0 2 4
df_out = (df_in.assign(Group1=df_in.reindex(gp1, axis=1).dropna().min(axis=1),
Group2=df_in.reindex(gp2, axis=1).dropna().max(axis=1))
.dropna(axis=1, how='all'))
print(df_out)
# A B C D Group1
# 0 1 2 3 4 1
# 1 2 4 6 2 2
# 2 1 0 2 4 0
df_in = df_in_copy.copy() #Copy for copy create
df_in = df_in.drop(['A','D'], axis=1) #Drop Columns A and D
print(df_in)
# B C E
# 0 2 3 5
# 1 4 6 3
# 2 0 2 2
df_out = (df_in.assign(Group1=df_in.reindex(gp1, axis=1).dropna().min(axis=1),
Group2=df_in.reindex(gp2, axis=1).dropna().max(axis=1))
.dropna(axis=1, how='all'))
print(df_out)
# B C E
# 0 2 3 5
# 1 4 6 3
# 2 0 2 2