2013-05-14 65 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)