Вы можете выполнить цикл через серию с функцией apply()
и преобразовать каждый список в Series
, это автоматически расширит список как серию в направлении столбца:
df[0].apply(pd.Series)
# 0 1 2
#0 8 10 12
#1 7 9 11
Обновить : Чтобы сохранить другие столбцы фрейма данных, вы можете связать результат с столбцами, которые вы хотите сохранить:
pd.concat([df[0].apply(pd.Series), df[1]], axis = 1)
# 0 1 2 1
#0 8 10 12 A
#1 7 9 11 B
TextInfo.ToTitleCase()
использует первый символ в каждом знаке строки. Если вам не нужно поддерживать Акроним Uppercasing, тогда вы должны включить ToLower()
.
string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"
Если CurrentCulture недоступен, используйте:
string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());
См. MSDN Link для подробного описания.
Надеюсь, это вам поможет.
String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
Самым прямым вариантом будет использование функции ToTitleCase , доступной в .NET, которая должна заботиться о имени большую часть времени. Как указал edg , есть некоторые имена, для которых это не сработает, но они довольно редки, поэтому, если вы не нацеливаете культуру, где такие имена являются общими, не нужно то, что вам тоже нужно беспокоиться
Однако, если вы не работаете с .NET langauge, это зависит от того, как выглядит вход - если у вас есть два отдельных поля для имени и фамилии, то вы можете просто
firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();
Однако, если вам предоставлено несколько имен как часть одной и той же строки, вам необходимо знать, как вы получаете информацию, и разделить его соответственно. Поэтому, если вы получаете такое имя, как «John Doe», вы разбиваете строку на основе символа пробела. Если он находится в таком формате, как «Doe, John», вам нужно разбить его на основе запятой. Однако, как только вы разделите его, вы просто примените код, показанный ранее.
CultureInfo.CurrentCulture.TextInfo.ToTitleCase («мое имя»);
возвращает ~ My Name
Но проблема все еще существует с такими именами, как McFly, как указано ранее.
Этот класс делает трюк. Вы можете добавить новые префиксы в статический массив строк _prefixes.
public static class StringExtensions
{
public static string ToProperCase( this string original )
{
if( String.IsNullOrEmpty( original ) )
return original;
string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
return result;
}
public static string WordToProperCase( this string word )
{
if( String.IsNullOrEmpty( word ) )
return word;
if( word.Length > 1 )
return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );
return word.ToUpper( CultureInfo.CurrentCulture );
}
private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
private static readonly string[] _prefixes = {
"mc"
};
private static string HandleWord( Match m )
{
string word = m.Groups[1].Value;
foreach( string prefix in _prefixes )
{
if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
}
return word.WordToProperCase();
}
}
Если вы используете vS2k8, вы можете использовать метод расширения, чтобы добавить его в класс String:
public static string FirstLetterToUpper(this String input)
{
return input = input.Substring(0, 1).ToUpper() +
input.Substring(1, input.Length - 1);
}
Mc и Mac - обычные префикс фамилии по всей территории США, и есть другие. TextInfo.ToTitleCase не обрабатывает эти случаи и не должен использоваться для этой цели. Вот как я это делаю:
public static string ToTitleCase(string str)
{
string result = str;
if (!string.IsNullOrEmpty(str))
{
var words = str.Split(' ');
for (int index = 0; index < words.Length; index++)
{
var s = words[index];
if (s.Length > 0)
{
words[index] = s[0].ToString().ToUpper() + s.Substring(1);
}
}
result = string.Join(" ", words);
}
return result;
}
Чтобы обойти некоторые проблемы / проблемы, которые были выделены ben, я бы предложил сначала преобразовать строку в нижний регистр, а затем вызвать метод ToTitleCase. Затем вы можете использовать IndexOf («Mc») или IndexOf («O \») для определения особых случаев, требующих особого внимания.
inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc > 0)
{
inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}
Как указано edg, вам понадобится более сложный алгоритм для обработки специальных имен (вероятно, поэтому многие места заставляют все в верхнем регистре).
Что-то вроде этого непроверенного c # должно обрабатывать простой случай вы запросили:
public string SentenceCase(string input)
{
return input(0, 1).ToUpper + input.Substring(1).ToLower;
}
public static string ConvertToCaptilize(string input)
{
if (!string.IsNullOrEmpty(input))
{
string[] arrUserInput = input.Split(' ');
// Initialize a string builder object for the output
StringBuilder sbOutPut = new StringBuilder();
// Loop thru each character in the string array
foreach (string str in arrUserInput)
{
if (!string.IsNullOrEmpty(str))
{
var charArray = str.ToCharArray();
int k = 0;
foreach (var cr in charArray)
{
char c;
c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
sbOutPut.Append(c);
k++;
}
}
sbOutPut.Append(" ");
}
return sbOutPut.ToString();
}
return string.Empty;
}
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
Есть некоторые случаи, которые невозможно обработать CultureInfo.CurrentCulture.TextInfo.ToTitleCase
, например: апостроф '
.
string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
Регулярное выражение также может использоваться \b[a-zA-Z]
для определения стартового символа слова после границы слова \b
, нам нужно просто заменить соответствие его эквивалентом в верхнем регистре с помощью метода Regex.Replace(string input,string pattern,MatchEvaluator evaluator)
:
string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo
Регулярное выражение может быть если необходимо, например, если мы хотим обрабатывать случаи MacDonald
и McFry
, то регулярное выражение становится: (?<=\b(?:mc|mac)?)[a-zA-Z]
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry
Если нам нужно обрабатывать больше префиксов, нам нужно только изменить группу (?:mc|mac)
, например, чтобы добавить французские префиксы du, de
: (?:mc|mac|du|de)
.
Наконец, мы можем понять, что это регулярное выражение также будет соответствовать случаю MacDonald'S
для последнего 's
, поэтому нам нужно обработать его в регулярном выражении с отрицательным внешним видом (?<!'s\b)
. В конце мы имеем:
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);
Вышеприведенный код не работает .....
, поэтому поставьте ниже код путем преобразования в нижний, затем примените функцию
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
Я использую свой собственный метод, чтобы получить это исправление:
Например, фраза: «hello world. hello this is the stackoverflow world». будет «Hello World. Hello This Is The Stackoverflow World». Regex \ b (начало слова) \ w (первый символ слова) сделает трюк.
/// <summary>
/// Makes each first letter of a word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w");
Phrase = Phrase.ToLower();
foreach (Match Match in Matches)
Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());
return Phrase;
}
Мне нравится этот путь:
using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());
Поднят из этой статьи MSDN .
Предложения по использованию ToTitleCase не будут работать для строк, которые все в верхнем регистре. Таким образом, вам придется вызвать ToUpper на первом символе и ToLower на оставшиеся символы.