2015-05-29 3 views
0

Я хотел бы извлечь значения точек и частоты букв Scrabble. Википедия дает следующую таблицу (скопирована с http://en.wikipedia.org/wiki/Scrabble_letter_distributions#English ).Pandas: преобразуйте DataFrame, разделив каждое значение на несколько значений.

# English Scrabble points (rows) and frequencies (columns). 
scrabble_table = """ 
    ×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       
""" 

, который я могу импортировать как DataFrame без проблем.

pd.read_table(io.StringIO(scrabble_table), index_col=0).fillna("") 

Изображение resulting table.

Эта таблица имеет значения, такие как «L S U» в 1-точечной строке и 4-частотном столбце. Я бы хотел, чтобы таблица имела одну строку на букву и три столбца: букву, частоту и значение точки. Может кто-нибудь предложить, как я преобразую свою оригинальную таблицу, чтобы получить то, что я хочу? Благодарю.

+0

Можете ли вы показать, как выглядит этот загруженный df, когда я запускаю ваш код, я получаю 0 столбцов и очень длинный список в виде сингла e value – EdChum

+0

Извините - вкладки стали местами, когда я вставлял их в Stack Overflow. Я добавил ссылку на изображение таблицы. – papajohn

ответ

1

Поскольку пространства, скажем, 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 
Смежные вопросы