#python #pandas #dataframe #string-length #maxlength
#python #pandas #фрейм данных #длина строки #максимальная длина
Вопрос:
Я использую библиотеку Pandas в Python и пытаюсь увеличить длину столбца с текстом, чтобы все они были одинаковой длины. Я пытаюсь сделать это, добавляя определенный символ (обычно это будет пробел, в этом примере я буду использовать «_») несколько раз, пока он не достигнет максимальной длины этого столбца.
Например:
Col1_Before
A
B
A1R
B2
AABB4
Col1_After
A____
B____
A1R__
B2___
AABB4
До сих пор я дошел до этого (используя приведенную выше таблицу в качестве примера). Это следующая часть (и та часть, которая это делает, на которой я застрял).
df['Col1_Max'] = df.Col1.map(lambda x: len(x)).max()
df['Col1_Len'] = df.Col1.map(lambda x: len(x))
df['Difference_Len'] = df ['Col1_Max'] - df ['Col1_Len']
Возможно, я недостаточно хорошо объяснил себя, поскольку я все еще учусь. Если это сбивает с толку, дайте мне знать, и я уточню.
Ответ №1:
рассмотрим pd.Series
s
s = pd.Series(['A', 'B', 'A1R', 'B2', 'AABB4'])
решение
используйте str.ljust
m = s.str.len().max()
s.str.ljust(m, '_')
0 A____
1 B____
2 A1R__
3 B2___
4 AABB4
dtype: object
для вашего случая
m = df.Col1.str.len().max()
df.Col1 = df.Col1.ljust(m '_')
Комментарии:
1. Мне понравился этот ответ. Я никогда не рассматривал возможность использования ряда. Мне нужно запустить процесс несколько раз, что заставило меня склониться к другому решению.
2. @user3601042 в pandas каждый столбец в фрейме данных представляет собой серию. df.Col1 — это серия. Это относится к вашему вопросу, например:
m = df.Col1.str.len().max()
Тогдаdf.Col1 = df.Col1.str.ljust(m, '_')
меня не волнует выбор ответа, но мне важно, чтобы вы понимали, как использовать этот ответ. Я обновлю свой пост.3. Это имеет смысл. Ваш ответ изменил мой образ мышления. Я понял, что каждый столбец представляет собой серию. Однако никогда в контексте проблемы и как использовать это для построения решения такой проблемы (я думаю, недостаток самостоятельного обучения). Ответ помог больше, чем вы, вероятно, понимаете. Я ценю ваше время. Спасибо.
Ответ №2:
Это не самое похожее на pandas решение, но вы можете попробовать следующее:
col = np.array(["A", "B", "A1R", "B2", "AABB4"])
data = pd.DataFrame(col, columns=["Before"])
Теперь вычислите максимальную длину, список отдельных длин и различия:
max_ = data.Before.map(lambda x: len(x)).max()
lengths_ = data.Before.map(lambda x: len(x))
diffs_ = max_ - lengths_
Создайте новый столбец под названием After
добавление подчеркивания или любого другого символа:
data["After"] = data["Before"] ["_"*i for i in diffs_]
Все это дает:
Before After
0 A A____
1 B B____
2 A1R A1R__
3 AABB4 AABB4
Ответ №3:
Без создания дополнительных столбцов:
In [63]: data
Out[63]:
Col1
0 A
1 B
2 A1R
3 B2
4 AABB4
In [64]: max_length = data.Col1.map(len).max()
In [65]: data.Col1 = data.Col1.apply(lambda x: x '_'*(max_length - len(x)))
In [66]: data
Out[66]:
Col1
0 A____
1 B____
2 A1R__
3 B2___
4 AABB4
Комментарии:
1. Спасибо за это. Добавил это в качестве функции для одновременного запуска в нескольких столбцах, и это сработало.