熊猫数据帧以很好的方式处理"列表"元素



更新:@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。这使得脚本更加"崩溃安全"。

希望这对你有帮助!

最新更新