Выберите параметр из задания без чувствительности к регистру [дубликат]

df = pd.DataFrame({
'sp' : ['MM1', 'MM1', 'MM1', 'MM2', 'MM2', 'MM2', 'MM4', 'MM4','MM4'],
'mt' : ['S1', 'S1', 'S3', 'S3', 'S4', 'S4', 'S2', 'S2', 'S2'],
'val' : ['a', 'n', 'cb', 'mk', 'bg', 'dgb', 'rd', 'cb', 'uyi'],
'count' : [3,2,5,8,10,1,2,2,7]
})

df.groupby(['sp', 'mt']).apply(lambda grp: grp.nlargest(1, 'count'))
20
задан Jeffrey 21 August 2012 в 14:18
поделиться

2 ответа

c # позволяет использовать словари с ключами, которые не чувствительны к регистру, поэтому обходной путь, который я использовал, - это преобразовать JObject в словарь с набором StringComparer.CurrentCultureIgnoreCase, например:

JObject json = (JObject)JsonConvert.DeserializeObject(ptString);
Dictionary<string, object> d = new Dictionary<string, object>(json.ToObject<IDictionary<string, object>>(), StringComparer.CurrentCultureIgnoreCase);

String f = d["FROM"].ToString();
6
ответ дан cecilphillip 22 August 2018 в 08:21
поделиться
  • 1
    Недостатком этого подхода является то, что вы теряете способность получать что-либо ниже «уровня 1», что означает, что вы не можете получить какое-либо вложенное свойство. – user 13 July 2013 в 12:33
  • 2
    Я не вижу такой недостатки. Если вы не используете API Azure или автоматически созданный Swagger JSON, с глубиной должно быть мало проблем. Все это вычисляется, и классы создаются для обработки вложенности в правильном порядке. Это добавляет небольшое количество накладных расходов в зависимости от объекта, но в целом я считаю, что это очень полезно. В моем случае документация, созданная веб-клиентом, была изменена с помощью оболочки свойств ... снова. Поскольку они не придерживаются своего собственного «контракта», что-то вроде этого мешает мне вернуться и исправить код каждый раз. – Anthony Mason 26 August 2016 в 19:55

Это должно работать:

string json = @"{UPPER: 'value'}";
JObject o = JObject.Parse(json);
var value = o.GetValue("upper", StringComparison.OrdinalIgnoreCase)?.Value<string>();
71
ответ дан Gian Marco Gherardi 22 August 2018 в 08:21
поделиться
  • 1
    То же самое, похоже, не доступно для методов SelectToken. – Jacques Bosch 10 July 2015 в 12:35
  • 2
    Да, мне пришлось вручную заставить JToken игнорировать корпус, а затем найти его родительское имя, чтобы установить свойство, игнорируя оболочку имени свойства. – Salgat 28 January 2016 в 22:35
  • 3
    Я использовал этот ответ и немного изменил его: var value = o.GetValue («верхний», StringComparison.OrdinalIgnoreCase)? Значение & lt; string & gt; (); обрабатывать исключение нулевой ссылки, если ключ не находится в json. – Casey O'Brien 16 November 2017 в 17:26
  • 4
    @ CaseyO'Brien точно, я также следовал этому маршруту. Это лучшее решение указанной проблемы. – Ali Haider 15 March 2018 в 14:34
  • 5
    Обновлено сокращено в соответствии с предложением @ CaseyO'Brien – Gian Marco Gherardi 16 March 2018 в 08:47
Другие вопросы по тегам:

Похожие вопросы: