Поскольку пространства, скажем, L S U
должны быть проигнорированы, давайте сначала удалить все пробелы:
scrabble_table = scrabble_table.replace(' ', '')
Теперь читать таблицу в DataFrame.
df = pd.read_table(StringIO(scrabble_table), delimiter=',', index_col=0)
Для перемещения значений уровня столбца на новый уровень индекса, используйте stack()
. Поскольку уровней столбцов больше нет, stack()
возвращает серию. reset_index()
перемещает уровни индексов в столбцах:
df = df.stack().reset_index()
# level_0 level_1 0
# 0 0 ×2 (Blank)
# 1 1 ×4 LSU
# 2 1 ×6 NRT
# 3 1 ×8 O
# 4 1 ×9 AI
# 5 1 ×12 E
# 6 2 ×3 G
# 7 2 ×4 D
# 8 3 ×2 BCMP
# 9 4 ×2 FHVWY
# 10 5 ×1 K
# 11 8 ×1 JX
# 12 10 ×1 QZ
разместить (Blank)
на равных основаниях с другими плитками, заменим его с одного символа, например, как подчеркивание (_
).
df = df.replace('(Blank)', '_')
и в то время как мы на это, давайте называть столбцы значащие имена:
df.columns=['points', 'freq', 'letters']
Теперь мы можем составить список понимание, что перебирает строки с помощью df.iterrows()
, и для каждой строки, итерация над буквами, чтобы сформировать список кортежей. Каждый кортеж состоит из трех значений: (row['points'], row['freq'], letter)
. Проходя этот список понимание в pd.DataFrame
дает требуемый результат:
df = pd.DataFrame([(row['points'], row['freq'], letter)
for index, row in df.iterrows()
for letter in row[-1]], columns=['points', 'freq', 'letter'])
Чтобы сделать код проще вырезать и вставить, я заменил язычки запятыми:
import numpy as np
import pandas as pd
try:
# Python3
from io import StringIO
except ImportError:
# Python2
from StringIO import StringIO
scrabble_table = u'''\
,×1 ,×2 ,×3 ,×4 ,×6 ,×8 ,×9 ,×12
0, ,(Blank)
1,,,,L S U ,N R T ,O ,A I ,E
2 ,,,G ,D
3 ,,B C M P,,,,
4 ,,F H V W Y
5 ,K
8 ,J X
10 ,Q Z'''
scrabble_table = scrabble_table.replace(' ', '')
df = pd.read_table(StringIO(scrabble_table), delimiter=',', index_col=0)
df = df.stack().reset_index()
df = df.replace('(Blank)', '_')
df.columns=['points', 'freq', 'letters']
df = pd.DataFrame([(row['points'], row['freq'], letter)
for index, row in df.iterrows()
for letter in row[-1]], columns=['points', 'freq', 'letter'])
print(df)
урожаи
points freq letter
0 0 ×2 _
1 1 ×4 L
2 1 ×4 S
3 1 ×4 U
4 1 ×6 N
5 1 ×6 R
6 1 ×6 T
7 1 ×8 O
8 1 ×9 A
9 1 ×9 I
10 1 ×12 E
11 2 ×3 G
12 2 ×4 D
13 3 ×2 B
14 3 ×2 C
15 3 ×2 M
16 3 ×2 P
17 4 ×2 F
18 4 ×2 H
19 4 ×2 V
20 4 ×2 W
21 4 ×2 Y
22 5 ×1 K
23 8 ×1 J
24 8 ×1 X
25 10 ×1 Q
26 10 ×1 Z
Можете ли вы показать, как выглядит этот загруженный df, когда я запускаю ваш код, я получаю 0 столбцов и очень длинный список в виде сингла e value – EdChum
Извините - вкладки стали местами, когда я вставлял их в Stack Overflow. Я добавил ссылку на изображение таблицы. – papajohn