Удивительно, насколько сложно найти идеальное решение этой проблемы. Я еще не нашел ответа на этой странице, который не сработает, по крайней мере, в некоторых ситуациях (особенно если строка содержит символы новой строки или вкладки, или если слово break является чем-то другим, кроме пробела, или если строка имеет UTF- 8 многобайтовых символов).
Вот простое решение, которое работает во всех случаях. Здесь были похожие ответы, но модификатор «s» важен, если вы хотите, чтобы он работал с многострочным вводом, а модификатор «u» позволяет корректно оценивать многобайтовые символы UTF-8.
function wholeWordTruncate($s, $characterCount)
{
if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
return $s;
}
Один возможный краевой случай с этим ... если строка не имеет пробелов вообще в первых символах $ characterCount, она вернет всю строку. Если вы предпочитаете, чтобы он задерживал разрыв в $ characterCount, даже если он не является границей слов, вы можете использовать это:
function wholeWordTruncate($s, $characterCount)
{
if (preg_match("/^.{1,$characterCount}\b/su", $s, $match)) return $match[0];
return mb_substr($return, 0, $characterCount);
}
Последний параметр, если вы хотите, чтобы он добавлял многоточие, если он обрезает строка ...
function wholeWordTruncate($s, $characterCount, $addEllipsis = ' …')
{
$return = $s;
if (preg_match("/^.{1,$characterCount}\b/su", $s, $match))
$return = $match[0];
else
$return = mb_substr($return, 0, $characterCount);
if (strlen($s) > strlen($return)) $return .= $addEllipsis;
return $return;
}
Об этом спрашивали раньше и отвечали здесь на стеке панды группового сортировки внутри групп . Что вам нужно сделать, так это создать фрейм группировки данных и создать столбец с суммой агрегации. Теперь создайте вторую группу в новом столбце агрегации. Затем используйте .nlargest, как упомянуто в посте.
Вам нужно:
df = pd.DataFrame({'id':[1,2,3,4,5,6,7,8,9,10,11,12],
'level':['low','high','low','medium','medium','high','low','high','medium','high','medium','low'],
'values':[23,43,56,12,34,32,18,109,345,21,15,45]})
# use nlargest(10) for your problem.
print(df.groupby('level')['values'].nlargest(2))
Вывод:
level
high 7 109
1 43
low 2 56
11 45
medium 8 345
4 34