Из вопроса, который я задал здесь, я получил ответ JSON, похожий на это:
(обратите внимание: id
в моем образце данных ниже – это числовые строки, но некоторые – буквенно-цифровые)
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
},
{
"attacker_id": "3",
"defender_id": "7",
"damage": 100,
"order": 11
}
],
"opponentAttacks": 0,
"some_useless_data": "Want to ignore, this doesn't show in every record"
},
{
"id": "4",
"name": "Fred",
"level": 9,
"attacks": [
{
"attacker_id": "4",
"defender_id": "9",
"damage": 70,
"order": 4
}
],
"opponentAttacks": 0
}
]
}
}
Я загрузил это, используя:
df = json_normalize([data['team'], data['opponent']],
'members',
['id', 'name'],
meta_prefix='team.',
errors='ignore')
print(df.iloc(1))
attacks [{'damage': 70, 'order': 4, 'defender_id': '9'...
id 4
level 9
name Fred
opponentAttacks 0
some_useless_data NaN
team.name Bad Guys
team.id 987654321
Name: 3, dtype: object
По сути, у меня вопрос из 3 частей.
Как получить строку, подобную приведенной выше, с помощью тега участника? Я пробовал:
member = df[df['id']=="1"].iloc[0] #Now this works, but am I correctly doing this? #It just feels weird is all.
Как мне получить защиту участника, основываясь только на том, что записываются только атаки, а не защиты (даже несмотря на то, что задан defer_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()
во втором вопросе, который я связал выше, поставила меня в тупик.
df1
? этоdf.iloc[1]
? - person U11-Forward   schedule 05.02.2019df
. Мой плохой, и я провел много исследований о том, как использовать pandas. Я нашел свой ответ, и @a_guest ответил правильно. - person Jab   schedule 05.02.2019