如何根据是否存在另一组列来创建新列

2024-10-03 11:21:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我的问题如下:

我有一个数据帧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)

    df_in 
              B   C  E
              2   3  5
              4   6  3
              0   2  2
              
    
    df_out
              B   C   E  Group2
              2   3   5    5
              4   6   3    6
              0   2   2    2

当集合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

在这方面的任何帮助都将不胜感激。谢谢


Tags: 数据代码in目的示例df逻辑out
1条回答
网友
1楼 · 发布于 2024-10-03 11:21:16

给你,我想你可以用这个:

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:

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

相关问题 更多 >