Pandas数据帧处理'列表'元素在一个很好的方式

2024-06-16 09:20:43 发布

您现在位置:Python中文网/ 问答频道 /正文

更新:@AntonvBR的答案有效。非常感谢

此外,因为这里我要处理一个tea列中的每个元素,所以它实际上是一个Series而不是一个DataFrame。因此,我猜.apply()的工作原理与.map()相同


原始问题:

很抱歉,我不知道如何更好地表达我的观点,但这里有一个问题:

假设有两个数据帧,学生和老师。

学生数据框有两列:IDhome(她或他来自哪个城市)。当然,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]

现在我想增加关于教师的第三列,它也包含教师的学生的家庭的列表,每个列表中应该没有重复的

所以我想知道我怎样才能以一种看起来整洁干净的方式来做这件事

我对pandas和SQL还不熟悉,我想到的唯一方法就是迭代每一行,迭代每一个列表,从另一个DataFrame获取值,然后逐个追加它们

请给我一些建议或提示

非常感谢


Tags: 数据答案iniddataframehome列表教师
1条回答
网友
1楼 · 发布于 2024-06-16 09:20:43

好吧,这是一个很小的问题,可以用很多方法来解决。不管怎样, 在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]

简短解释: 应用于dataframe列的.apply()将获取所有元素,并为每个元素执行一个函数(在本例中表示行值)。 通过传递lambda函数,表达式变得非常紧凑。 我们要为每个行元素中的每个元素找到student home。为此,我们可以使用列表理解并从我们在上面一行中创建的字典(map)中获取值m.get(i, 'N/A')将获取每个值,如果找不到,则返回N/A。这使得脚本更“安全”

希望这对你有帮助

相关问题 更多 >