Есть ли способ добавить имя столбца во все строки кадра данных на основе заданного условия c в pandas? - PullRequest
1 голос
/ 22 апреля 2020

У меня есть такой фрейм данных:

   Name  Age  Class Maths English Physics Bio Chemistry
    A     13   7      1    None     None   1    None
    B     17   10    None   1        1    None  None

Я хочу добавить новый столбец с именем Subject, который должен включать имена столбцов (имеющие 1) в качестве значений поля темы, как показано ниже:

   Name  Age  Class    Subject     
    A     13   7     Maths, Bio
    B     17   10    English, Physics

Я пытался использовать несколько способов, но это занимает больше времени, чем обычно.

Ответы [ 3 ]

3 голосов
/ 22 апреля 2020

Вы можете использовать apply с функцией lambda.

df['Subject'] = (df == '1').apply(lambda x: ','.join(df.columns[x]), axis=1)
df = df.iloc[:, [0,1,2,-1]]
df
  Name  Age  Class           Subject
0    A   13      7        Maths, Bio
1    B   17     10  English, Physics
2 голосов
/ 22 апреля 2020
#extract subjects columns
subjects = df.iloc[:,3:].columns

#identify columns that are not na per row
notnull = df.filter(subjects).notna().to_numpy()

#get the non null columns and assign to subject column
#... still thinking of a non python loop ... glad if anyone can drop a better replacement
df['subjects'] = [subjects[row].str.cat(sep=', ') for row in notnull]

#drop subjects list
df.drop(subjects,axis=1)

    Name    Age Class   subjects
0   A        13   7     Maths, Bio
1   B        17   10    English, Physics
1 голос
/ 22 апреля 2020

Один, легкий для чтения метод:

subjects = ['Maths', 'English', 'Physics', 'Bio', 'Chemistry']

df['Subject'] = ""
for row in range(len(df.index)):
    output = []
    for i, col in enumerate(df.loc[df.index[row], subjects]):
        if col == 1:
            output.append(str(subjects[i]))
    df.at[df.index[row], 'Subject'] = ", ".join(output)
...