在另一个单独的数据帧中使用一个数据帧中的 id 抓取数据,该数据帧不具有相同的列名并将字符串附加到一个值
Posted
技术标签:
【中文标题】在另一个单独的数据帧中使用一个数据帧中的 id 抓取数据,该数据帧不具有相同的列名并将字符串附加到一个值【英文标题】:Grabbing data using an id in one dataframe in another separate dataframe that do not posses the same column name and appending string to one value 【发布时间】:2021-11-14 13:52:41 【问题描述】:我有两个数据框
jedis = jedi_id': ["2", "4", "6", "1"],
'name':["Kylo", "Bastila", "Revan", "Steve from Minecraft"],
'Looted Items':
inventory = jedi_number': ["9", "4" , "6", "1", "1", "0", "2", "6", "1" , "55", "4",
"4", "0", "9"], 'Loot':["Holocron", "Bantha Fodder", "Blaster", "Bantha Fodder", "Credits", "Bantha Fodder", "Blaster", "Bantha Fodder", "Holocron", "Blaster", "Holocron", "bread loaf", "Credits", "Holocron"]
jedis_df = pd.DataFrame(jedis)
inventory_df = pd.DataFrame(inventory)
所以在这个问题中,我需要通过 jedi_df 从 jedis_df 中取出所有 jedis 并确认 它们存在于inventory_df中。 (ex.jedi_id 2 存在于库存中)
一旦识别出 ID 并在 jedis_df 中,则关联的战利品将附加到带有关联 ID 的 jedis_df 中
示例:Revan 将在“掠夺物品”列和相应绝地 ID 旁边的相同单元格中显示“blaster,holocron”x = jedis_df.merge(
inventory_df.groupby("jedi_number").sum(),
left_on="jedi_id",
right_index=True,
how="left",
)
我尝试合并这两个表,但无法找到解决方案。
我只知道如何将一个特定的对应匹配 id 添加到一个单元格,所以这对我来说是新的。
如果有人能帮助解决这个问题,将不胜感激
【问题讨论】:
【参考方案1】:groupby.sum
自动排除非数字列,因此它不会像您期望的那样在组内连接字符串。
解决方案是在每个组的Loot
值上运行', ',join
。
选项 1: groupby.agg
inventory_df.groupby("jedi_number")['Loot'].agg(', '.join)
选项 2: groupby.apply
inventory_df.groupby("jedi_number")['Loot'].apply(lambda x: ', '.join(x))
两个选项产生相同的输出:
jedi_number
0 Bantha Fodder, Credits
1 Bantha Fodder, Credits, Holocron
2 Blaster
4 Bantha Fodder, Holocron, bread loaf
55 Blaster
6 Blaster, Bantha Fodder
9 Holocron, Holocron
Name: Loot, dtype: object
将inventory_df.groupby("jedi_number").sum()
替换为x
表达式中的任一选项应该会产生所需的结果。
【讨论】:
这成功了!太感谢了!必须将输出转换为 DF 并重新索引数据帧,但很好的解决方案。以上是关于在另一个单独的数据帧中使用一个数据帧中的 id 抓取数据,该数据帧不具有相同的列名并将字符串附加到一个值的主要内容,如果未能解决你的问题,请参考以下文章
在 spark scala 中为数据帧中的每个组采样不同数量的随机行