如何根据多个列的特定条件创建具有值作为标题名称的新列?

huangapple go评论70阅读模式
英文:

How to create new column with header name as value based on specific condition of multiple columns?

问题

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

import numpy as np
import pandas as pd

df = pd.DataFrame({"ID":[1, 1, 2, 3, 3, 4],
                   "CLASS A":[np.nan, 1, np.nan, np.nan, np.nan, np.nan],
                   "CLASS B":[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                   "CLASS C":[np.nan, np.nan, np.nan, 1, np.nan, np.nan],
                   "DEPTH":[12, 31, 45, 66, 32, 46]})

df

我想要创建一个新的列(df["FILTER"]),该列的值是包含数字1的列的名称,但仅查看列(CLASS A、CLASS B和CLASS C)。因此,我的最终数据框应该如下所示:

     ID  CLASS A  CLASS B  CLASS C  DEPTH     FILTER
0   1      NaN      NaN      NaN     12     NaN
1   1      1.0      NaN      NaN     31     CLASS A
2   2      NaN      NaN      NaN     45     NaN
3   3      NaN      NaN      1.0     66     CLASS C
4   3      NaN      NaN      NaN     32     NaN
5   4      NaN      NaN      NaN     46     NaN

有人可以帮助我吗?

英文:

Imagine I have a dataframe like this:

import numpy as np
import pandas as pd

df = pd.DataFrame({"ID":[1, 1, 2, 3, 3, 4],
                   "CLASS A":[np.nan, 1, np.nan, np.nan, np.nan, np.nan],
                   "CLASS B":[np.nan, np.nan, np.nan, np.nan, np.nan, np.nan],
                   "CLASS C":[np.nan, np.nan, np.nan, 1, np.nan, np.nan],
                   "DEPTH":[12, 31, 45, 66, 32, 46]})

df
Out[4]: 
   ID  CLASS A  CLASS B  CLASS C  DEPTH
0   1      NaN      NaN      NaN     12
1   1      1.0      NaN      NaN     31
2   2      NaN      NaN      NaN     45
3   3      NaN      NaN      1.0     66
4   3      NaN      NaN      NaN     32
5   4      NaN      NaN      NaN     46

I would like to create a new column (df["FILTER"]) with the name of the column as value where I have the number 1, but only looking to the columns (CLASS A, CLASS B and CLASS C). So my final dataframe should look like this:

 ID  CLASS A  CLASS B  CLASS C  DEPTH     FILTER
0   1      NaN      NaN      NaN     12     NaN
1   1      1.0      NaN      NaN     31     CLASS A
2   2      NaN      NaN      NaN     45     NaN
3   3      NaN      NaN      1.0     66     CLASS C
4   3      NaN      NaN      NaN     32     NaN
5   4      NaN      NaN      NaN     46     NaN

Anyone could help me?

答案1

得分: 4

使用filter选择列和idxmax获取标题:

df['FILTER'] = df.filter(like='CLASS').idxmax(axis=1)

输出:

   ID  CLASS A  CLASS B  CLASS C  DEPTH   FILTER
0   1      NaN      NaN      NaN     12      NaN
1   1      1.0      NaN      NaN     31  CLASS A
2   2      NaN      NaN      NaN     45      NaN
3   3      NaN      NaN      1.0     66  CLASS C
4   3      NaN      NaN      NaN     32      NaN
5   4      NaN      NaN      NaN     46      NaN
英文:

Use filter to select the columns and idxmax to get the header:

df['FILTER'] = df.filter(like='CLASS').idxmax(axis=1)

Output:

   ID  CLASS A  CLASS B  CLASS C  DEPTH   FILTER
0   1      NaN      NaN      NaN     12      NaN
1   1      1.0      NaN      NaN     31  CLASS A
2   2      NaN      NaN      NaN     45      NaN
3   3      NaN      NaN      1.0     66  CLASS C
4   3      NaN      NaN      NaN     32      NaN
5   4      NaN      NaN      NaN     46      NaN

答案2

得分: 2

尝试这段代码之前,最好先了解一下idxmax函数:

class_columns = ["CLASS A", "CLASS B", "CLASS C"]
df['FILTER'] = df[class_columns].idxmax(axis=1)
df['FILTER'] = df['FILTER'].where(df[class_columns].max(axis=1) == 1, np.nan)
英文:

Try this code, before will be great read about idxmax:

class_columns = ["CLASS A", "CLASS B", "CLASS C"]
df['FILTER'] = df[class_columns].idxmax(axis=1)
df['FILTER'] = df['FILTER'].where(df[class_columns].max(axis=1)==1, np.nan)

huangapple
  • 本文由 发表于 2023年6月27日 21:37:10
  • 转载请务必保留本文链接:https://go.coder-hub.com/76565458.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定