2013-05-14 67 views
2

我有一個有21列的熊貓數據框。我將重點放在具有完全相同的列數據值的行的子集上,除了每行獨有的6以外。我不知道哪些列標題這6個值對應於先驗。比較熊貓數據幀的行(行有一些重疊的值)

我試着將每一行轉換爲索引對象,並對兩行執行set操作。防爆。

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

它返回包含row1唯一值的Index對象。然後我可以手動推斷哪些列具有唯一值。

如何以編程方式獲取這些值在初始數據框中對應的列標題?或者,有沒有辦法比較兩個或多個數據框行並提取每行的6個不同列值以及相應的標題?理想情況下,使用獨特的列生成新的數據框會很好。

特別是,有沒有辦法使用set操作來做到這一點?

謝謝。

+0

因此,有哪些是15合普通一組行,6個不同的行以及其他不遵循此模式的行? [IOW,我們是否必須檢測這個「行子集」或已經完成?] – DSM 2013-05-14 00:56:52

+0

可以發佈幾行樣本行嗎? – Jeff 2013-05-14 02:02:04

回答

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)