繁体   English   中英

从与另一列中的值匹配的列中的列表中删除值

[英]Removing value from list in column that matches value from another column

我有以下 dataframe:

   df = pd.DataFrame(
       {
          "Student": ['Scooby','Daphne','Shaggy','Fred'],
          "window": [['Scooby','Daphne'], ['Daphne','Velma','Scrappy'], ['Daphne','Shaggy','Fred'],['Fred','Velma','Scrappy']]
       }
    )

这给了我:

  Student                    window
0  Scooby          [Scooby, Daphne]
1  Daphne  [Daphne, Velma, Scrappy]
2  Shaggy    [Daphne, Shaggy, Fred]
3    Fred    [Fred, Velma, Scrappy]

如何从 window 列中的相应列表中删除学生列中的名称?

结果应该是:

  Student                    window
0  Scooby                  [Daphne]
1  Daphne          [Velma, Scrappy]
2  Shaggy            [Daphne, Fred]
3    Fred          [Velma, Scrappy]

我正在考虑使用类似的东西:

df['window'] = df['window'].apply(lambda x: x.remove(df['Student'])

但显然我错过了只选择相应行学生姓名的元素。 有谁知道我应该如何解决这个问题?

您需要apply整个 df,而不仅仅是一列,才能访问 Student 列。

df['window'] = df.apply(lambda row: [w for w in row['window'] if w != row['Student']], axis=1)

你需要在这里循环。 最有效的将是列表理解:

df['window'] = [[x for x in b if x!=a]
                for a,b in zip(df['Student'], df['window'])]

修改DataFrame:

  Student            window
0  Scooby          [Daphne]
1  Daphne  [Velma, Scrappy]
2  Shaggy    [Daphne, Fred]
3    Fred  [Velma, Scrappy]

循环遍历字典:

df = pd.DataFrame(
    {
        "Student": ['Scooby', 'Daphne', 'Shaggy', 'Fred'],
        "window": [['Scooby', 'Daphne'], ['Daphne', 'Velma', 'Scrappy'], ['Daphne', 'Shaggy', 'Fred'],
                   ['Fred', 'Velma', 'Scrappy']]
    }
)

for student, window in zip(df["Student"], df["window"]):
    window.remove(student)

使用.explode.map另一种方式

s = df.explode("window")

df["window_new"] = df["Student"].map(
         s[s["window"].ne(s["Student"])].groupby("Student").agg(list)["window"]
     )

print(df)

  Student                    window        window_new
0  Scooby          [Scooby, Daphne]          [Daphne]
1  Daphne  [Daphne, Velma, Scrappy]  [Velma, Scrappy]
2  Shaggy    [Daphne, Shaggy, Fred]    [Daphne, Fred]
3    Fred    [Fred, Velma, Scrappy]  [Velma, Scrappy]

您还可以使用:

df.apply(lambda row : row['window'].remove(row['Student']), axis=1)

它改变了你现有的df。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM