为了账号安全,请及时绑定邮箱和手机立即绑定

如何根据其他行和其他数据帧在数据帧中查找行

如何根据其他行和其他数据帧在数据帧中查找行

慕婉清6462132 2021-10-26 18:53:24
从我在这里问的问题中,我得到了一个与此类似的 JSON 响应:(请注意:id在我下面的示例数据中 's 是数字字符串,但有些是字母数字)data=↓**{  "state": "active",  "team_size": 20,  "teams": {    "id": "12345679",    "name": "Good Guys",    "level": 10,    "attacks": 4,    "destruction_percentage": 22.6,    "members": [      {        "id": "1",        "name": "John",        "level": 12      },      {        "id": "2",        "name": "Tom",        "level": 11,        "attacks": [          {            "attackerTag": "2",            "defenderTag": "4",            "damage": 64,            "order": 7          }        ]      }    ]  },  "opponent": {    "id": "987654321",    "name": "Bad Guys",    "level": 17,    "attacks": 5,    "damage": 20.95,    "members": [      {        "id": "3",        "name": "Betty",        "level": 17,        "attacks": [          {            "attacker_id": "3",            "defender_id": "1",            "damage": 70,            "order": 1          }, 本质上我有一个由 3 部分组成的问题。如何使用成员标签获得像上面那样的行?我试过了:member = df[df['id']=="1"].iloc[0]#Now this works, but am I correctly doing this?#It just feels weird is all.仅考虑到仅记录攻击而不记录防御(即使提供了 defender_id),我将如何检索成员的防御?我试过了:df.where(df['tag']==df['attacks'].str.get('defender_id'), df['attacks'], axis=0)#This is totally not working.. Where am I going wrong?由于我正在从 API 检索新数据,因此我需要检查数据库中的旧数据以查看是否有任何新攻击。然后我可以遍历新的攻击,然后向用户显示攻击信息。这我真的想不通,我试图寻找到这个问题,并且这其中还有,我觉得是任何接近我需要什么,我仍然有麻烦缠绕的概念我的大脑。基本上我的逻辑如下:def get_new_attacks(old_data, new_data)    '''params         old_data: Dataframe loaded from JSON in database         new_data: Dataframe loaded from JSON API response                   hopefully having new attacks       returns:         iterator over the new attacks    '''    #calculate a dataframe with new attacks listed    return df.iterrows()我知道除了我提供的文档(基本上是为了显示我想要的输入/输出)之外,上面的函数几乎没有显示任何努力,但相信我,我一直在为这部分绞尽脑汁。我一直在研究merg所有攻击然后做reset_index(),由于攻击是一个列表,这只会引发错误。map()我上面链接的第二个问题中的功能让我很难过。
查看完整描述

1 回答

?
慕容森

TA贡献1853条经验 获得超18个赞

按顺序参考您的问题(代码如下):

  1. 我看起来像是id数据的唯一索引,因此您可以使用df.set_index('id')df.loc['1'],例如通过玩家 ID 访问数据。

  2. 据我了解您的数据,每个字典中列出的所有字典attacks都是独立的,从某种意义上说,不需要相应的玩家 ID(因为attacker_iddefender_id似乎足以识别数据)。因此,我建议不要处理包含列表的行,而是将这些数据交换到它自己的数据框中,这样可以轻松访问。

  3. 一旦您存储attacks在它自己的数据框中,您就可以简单地比较索引以过滤掉旧数据。

下面是一些示例代码来说明各个要点:

# Question 1.

df.set_index('id', inplace=True)

print(df.loc['1'])  # For example player id 1.


# Question 2 & 3.

attacks = pd.concat(map(

    lambda x: pd.DataFrame.from_dict(x).set_index('order'),  # Is 'order' the right index?

    df['attacks'].dropna()

))


# Question 2.

print(attacks[attacks['defender_id'] == '1'])  # For example defender_id 1.


# Question 3.

old_attacks = attacks.iloc[:2]  # For example.

new_attacks = attacks[~attacks.index.isin(old_attacks.index)]

print(new_attacks)


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号