2015-07-20 1 views
1

Привет всем У меня есть CSV файл, который содержит данные, как формат нижеПреобразование Два столбца кадра данных к появлению матрицы в панд

A a 
A b 
B f 
B g 
B e 
B h 
C d 
C e 
C f 

Первый столбец содержит элементы, второй столбец содержит доступную функцию от вектора признаков = [а , б, в, г, д, е, ж, з] Я хочу, чтобы преобразовать это вхождение матрицы выглядеть, как показано ниже

a,b,c,d,e,f,g,h 
A 1,1,0,0,0,0,0,0 
B 0,0,0,0,1,1,1,1 
C 0,0,0,1,1,1,0,0 

Может кто-нибудь сказать мне, как сделать это с помощью панд?

ответ

6

Вот еще один способ сделать это, используя pd.get_dummies().

import pandas as pd 

# your data 
# ======================= 
df 

    col1 col2 
0 A a 
1 A b 
2 B f 
3 B g 
4 B e 
5 B h 
6 C d 
7 C e 
8 C f 

# processing 
# =================================== 
pd.get_dummies(df.col2).groupby(df.col1).apply(max) 

     a b d e f g h 
col1      
A  1 1 0 0 0 0 0 
B  0 0 0 1 1 1 1 
C  0 0 1 1 1 0 0 
+0

Это работало как шарм. Спасибо! –

3

Неясных если данные есть опечатка или нет, но вы можете crosstab для этого:

In [95]: 
pd.crosstab(index=df['A'], columns = df['a']) 

Out[95]: 
a b d e f g h 
A     
A 1 0 0 0 0 0 
B 0 0 1 1 1 1 
C 0 1 1 1 0 0 

В данных выборках ваш второй столбец имеет значение a как имя этого столбца, но в вашем ожидаемом результате это в столбец в качестве значения

EDIT

OK Я исправил свои входные данные таким образом, он генерирует правильный результат:

In [98]: 
import pandas as pd 
import io 
t="""A a 
A b 
B f 
B g 
B e 
B h 
C d 
C e 
C f""" 
df = pd.read_csv(io.StringIO(t), sep='\s+', header=None, names=['A','a']) 
df 

Out[98]: 
    A a 
0 A a 
1 A b 
2 B f 
3 B g 
4 B e 
5 B h 
6 C d 
7 C e 
8 C f 

In [99]: 
ct = pd.crosstab(index=df['A'], columns = df['a']) 
ct 

Out[99]: 
a a b d e f g h 
A      
A 1 1 0 0 0 0 0 
B 0 0 0 1 1 1 1 
C 0 0 1 1 1 0 0 
+0

Какая версия панд это? В 0.13.1 '' pd.crosstab (df ['A'], df ['a']) 'работает, но использование' index' и 'column' kwargs вызывает непредвиденные исключения аргументов. – wflynny

+0

Я использую '0.16.2', возможно, аргументы не были названы или названы чем-то другим, проверит – EdChum

+0

Still +1, просто интересно, так как я использую старую версию. – wflynny