[英]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.