更新:@AntonvBR的答案有效。谢谢!
此外,由于我在这里处理的是茶叶专栏中的每个元素,因此它确实是一个Series
而不是DataFrame
。因此,我想.apply()
的工作方式与.map()
相同。
原始问题:
我很抱歉不知道如何表达我更好,但这里有这个问题:
假设有两个数据帧,学生和教师。
学生数据帧有两列:ID和家(她或他来自哪个城市(。当然,这些 ID 是唯一的。
另一方面,教师数据帧还有两列:ID 和学生 ID 列表(在其班级中(。
两者是这样的:
In [72]: stu
Out[72]:
ID home
0 1 XA
1 2 BJ
2 3 TJ
3 4 JN
4 5 CQ
5 6 SH
6 7 GZ
7 8 BJ
8 9 TJ
9 10 BJ
In [75]: tea
Out[75]:
ID stu
0 1 [1, 2, 3]
1 2 [2, 7, 8, 9]
2 3 [4, 5, 6, 10]
现在我想在TEACHER上添加第三列,其中还包含教师学生的"家">列表,每个列表中不应有重复项。
所以我想知道我怎样才能用熊猫的方式做到这一点,看起来整洁干净?
我是 pandas 和 SQL 的新手,我想出的唯一方法是迭代每一行,迭代每个列表,然后从另一个数据帧获取值并逐个附加它们......
请给我一些建议或提示。
谢谢。
好的,这是一个非常微不足道的问题,可以通过多种方式完成。无论如何stu
列中有对象这一事实使事情变得有点复杂。
请考虑以下示例:
import pandas as pd
stu = pd.DataFrame({
'ID': [1,2],
'home': ['XA','BJ']
})
tea = pd.DataFrame({
'ID': [1,2],
'stu': [[1],[1,2]]
})
m = stu.set_index('ID')['home'] # <-- this here creates a map between stu id and stu home
tea['stu_home'] = tea['stu'].apply(lambda x: [m.get(i,'N/A') for i in x])
print(tea)
返回:
ID stu stu_home
0 1 [1] [XA]
1 2 [1, 2] [XA, BJ]
简短说明:应用于数据帧列的.apply()
将获取所有元素并为每个元素执行一个函数(在本例中是指行值(。 通过传递 lambda 函数,表达式变得非常紧凑。 我们希望找到每个行元素中每个元素的学生主页。为此,我们可以使用列表理解并从我们在上行中创建的字典(map(中获取值。m.get(i, 'N/A')
将获取每个值,如果未找到,则返回N/A
。这使得脚本更加"崩溃安全"。
希望这对你有帮助!