Чтобы добавить к этому известному вопросу (хотя и слишком поздно): вы также можете сделать df.groupby('column_name').get_group('column_desired_value').reset_index()
, чтобы создать новый фрейм данных с указанным столбцом, имеющим определенное значение. Например,
import pandas as pd
df = pd.DataFrame({'A': 'foo bar foo bar foo bar foo foo'.split(),
'B': 'one one two three two two one three'.split()})
print("Original dataframe:")
print(df)
b_is_two_dataframe = pd.DataFrame(df.groupby('B').get_group('two').reset_index()).drop('index', axis = 1)
#NOTE: the final drop is to remove the extra index column returned by groupby object
print('Sub dataframe where B is two:')
print(b_is_two_dataframe)
Запустите это:
Original dataframe:
A B
0 foo one
1 bar one
2 foo two
3 bar three
4 foo two
5 bar two
6 foo one
7 foo three
Sub dataframe where B is two:
A B
0 foo two
1 foo two
2 bar two
Вот является решение для Perl http://daringfireball.net/2008/05/title_case
Вот является решение Ruby http://frankschmitt.org/projects/title-case
Вот решение остроты Ruby: http://snippets.dzone.com/posts/show/4702
'some string here'.gsub(/\b\w/){$&.upcase}
То, что делает острота, использует замену регулярного выражения первого символа каждого слова с прописной версией ее.
Вот простой статический метод сделать это в C#:
public static string ToTitleCaseInvariant(string targetString)
{
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}
С жемчугом Вы могли сделать это:
my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Здесь у Вас есть версия C++. Это имеет ряд не uppercaseable слова как prononuns и предлоги. Однако я не рекомендовал бы автоматизировать этот процесс, если необходимо иметь дело с важными текстами.
#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <set>
using namespace std;
typedef vector<pair<string, int> > subDivision;
set<string> nonUpperCaseAble;
subDivision split(string & cadena, string delim = " "){
subDivision retorno;
int pos, inic = 0;
while((pos = cadena.find_first_of(delim, inic)) != cadena.npos){
if(pos-inic > 0){
retorno.push_back(make_pair(cadena.substr(inic, pos-inic), inic));
}
inic = pos+1;
}
if(inic != cadena.length()){
retorno.push_back(make_pair(cadena.substr(inic, cadena.length() - inic), inic));
}
return retorno;
}
string firstUpper (string & pal){
pal[0] = toupper(pal[0]);
return pal;
}
int main()
{
nonUpperCaseAble.insert("the");
nonUpperCaseAble.insert("of");
nonUpperCaseAble.insert("in");
// ...
string linea, resultado;
cout << "Type the line you want to convert: " << endl;
getline(cin, linea);
subDivision trozos = split(linea);
for(int i = 0; i < trozos.size(); i++){
if(trozos[i].second == 0)
{
resultado += firstUpper(trozos[i].first);
}
else if (linea[trozos[i].second-1] == ' ')
{
if(nonUpperCaseAble.find(trozos[i].first) == nonUpperCaseAble.end())
{
resultado += " " + firstUpper(trozos[i].first);
}else{
resultado += " " + trozos[i].first;
}
}
else
{
resultado += trozos[i].first;
}
}
cout << resultado << endl;
getchar();
return 0;
}
Не используя готовую функцию, суперпростой алгоритм низкого уровня для преобразования строки в случай заголовка:
convert first character to uppercase.
for each character in string,
if the previous character is whitespace,
convert character to uppercase.
Это принимает, "преобразовывают символ в верхний регистр", сделает это правильно независимо от того, чувствителен ли символ к регистру (например, '+').
Если язык, который Вы используете, имеет поддерживаемый метод/функцию, тогда просто используют это (в качестве в методе C# ToTitleCase
)
, Если это не сделает, то Вы захотите сделать что-то как следующее:
<глоток> 1 , глоток> Для превращения в капитал его в, скажем, C - используют эти коды ASCII , чтобы найти целочисленное значение символа и вычесть 32 из него.
должно было бы быть намного больше проверки ошибок в коде (гарантирующий допустимые буквы и т.д.), и "Использовать для своей выгоды" функция должна будет наложить своего рода "схему случая заголовка" на буквы для проверки на слова, которые не должны быть capatilised ('и', 'но' и т.д. Здесь хорошая схема)
В Perl:
$string =~ s/(\w+)/\u\L$1/g;
Это находится даже в FAQ.
К capatilise это в, скажем, C - использует коды ASCII ( http://www.asciitable.com/ ), чтобы найти целочисленное значение символа и вычесть 32 из него.
Это - плохое решение, если Вы когда-нибудь планируете принять символы вне a-z и A-Z.
, Например: ASCII 134: ГҐ, ASCII 143: Г ….
Используя арифметику получает Вас: ASCII 102: вызовы библиотеки f
Use, не предполагайте, что можно использовать целочисленную арифметику на символах для возвращения чего-то полезного. Unicode хитер .
Я опасался бы автоматически upcasing всего whitespace-preceded-words в сценариях, где я рискну притягивать ярость педантов.
я, по крайней мере, рассмотрел бы реализацию словаря для случаев исключения как статьи и соединения. Созерцайте:
"Красавица и чудовище"
И когда дело доходит до имен собственных, вещь становится намного более ужасной.
Я думаю, что использование CultureInfo не всегда надежно, это простой и удобный способ манипулировать строкой вручную:
string sourceName = txtTextBox.Text.ToLower();
string destinationName = sourceName[0].ToUpper();
for (int i = 0; i < (sourceName.Length - 1); i++) {
if (sourceName[i + 1] == "") {
destinationName += sourceName[i + 1];
}
else {
destinationName += sourceName[i + 1];
}
}
txtTextBox.Text = desinationName;
В Silverlight нет ToTitleCase
в классе TextInfo
.
Вот простой способ, основанный на регулярных выражениях.
Примечание. Silverlight не имеет предварительно скомпилированных регулярных выражений, но для меня эта потеря производительности не является проблемой.
public string TitleCase(string str)
{
return Regex.Replace(str, @"\w+", (m) =>
{
string tmp = m.Value;
return char.ToUpper(tmp[0]) + tmp.Substring(1, tmp.Length - 1).ToLower();
});
}
В Excel есть встроенная формула PROPER (n)
.
Был очень доволен, увидев, что мне не пришлось писать это самому!