2013-05-14 2 views
2

У меня есть кадр данных pandas с 21 столбцом. Я фокусируюсь на подмножестве строк, которые имеют точно такие же значения данных столбца, за исключением 6, которые являются уникальными для каждой строки. Я не знаю, какие заголовки столбцов эти 6 значений соответствуют априори.Сравнение строк фрейма данных pandas (строки имеют некоторые перекрывающиеся значения)

Я попытался преобразовать каждую строку в объекты индекса и выполнить операцию установки на две строки. Ex.

row1 = pd.Index(sample_data[0]) 
row2 = pd.Index(sample_data[1]) 
row1 - row2 

, который возвращает объект Index, содержащий значения, уникальные для row1. Затем я могу вручную вывести, какие столбцы имеют уникальные значения.

Как я могу программно захватить заголовки столбцов, которые соответствуют этим значениям в исходном фрейме данных? Или есть способ сравнить две или несколько строк данных данных и извлечь 6 разных значений столбцов для каждой строки, а также соответствующие заголовки? В идеале было бы неплохо создать новый фреймворк с уникальными столбцами.

В частности, есть ли способ сделать это, используя операции набора?

спасибо.

+0

Так что группа строк, которые являются 15-в-общего , 6-разные, а также другие строки, которые не соответствуют этому шаблону? [IOW, нам нужно обнаружить это «подмножество строк» ​​или это уже сделано?] – DSM

+0

может отправить пару строк строк? – Jeff

ответ

0

Это быстрое решение для возврата только столбцов, в которых отличаются две первые строки.

In [13]: df = pd.DataFrame(zip(*[range(5), list('abcde'), list('aaaaa'), 
...        list('bbbbb')]), columns=list('ABCD')) 

In [14]: df 
Out[14]: 
    A B C D 
0 0 a a b 
1 1 b a b 
2 2 c a b 
3 3 d a b 
4 4 e a b 

In [15]: df[df.columns[df.iloc[0] != df.iloc[1]]] 
Out[15]: 
    A B 
0 0 a 
1 1 b 
2 2 c 
3 3 d 
4 4 e 

И решение, чтобы найти все столбцы с более чем одним уникальным значением на всем протяжении кадра.

In [33]: df[df.columns[df.apply(lambda s: len(s.unique()) > 1)]] 
Out[33]: 
    A B 
0 0 a 
1 1 b 
2 2 c 
3 3 d 
4 4 e 
0

Вам не нужен индекс, вы можете просто сравнить две строки и использовать их для фильтрации столбцов со списком.

df = pd.DataFrame({"col1": np.ones(10), "col2": np.ones(10), "col3": range(2,12)}) 
row1 = df.irow(0) 
row2 = df.irow(1) 
unique_columns = row1 != row2 
cols = [colname for colname, unique_column in zip(df.columns, bools) if unique_column] 
print cols # ['col3'] 

Если вы знаете, стандартное значение для каждого столбца, вы можете преобразовать все строки в список булевых, то есть:

standard_row = np.ones(3) 
columns = df.columns 
unique_columns = df.apply(lambda x: x != standard_row, axis=1) 
unique_columns.apply(lambda x: [col for col, unique_column in zip(columns, x) if unique_column], axis=1) 
Смежные вопросы