我有一个包含21列的pandas数据帧。我专注于具有完全相同的列数据值的行的子集,除了每行唯一的6个。我不知道这6个值的哪个列标题对应于先验。
我尝试将每一行转换为Index对象,并对两行执行set操作。实施例
row1 = pd.Index(sample_data[0])
row2 = pd.Index(sample_data[1])
row1 - row2
返回包含row1唯一值的Index对象。然后我可以手动推断哪些列具有唯一值。
如何以编程方式获取这些值在初始数据帧中对应的列标题?或者,有没有办法比较两个或多个数据帧行,并提取每行的6个不同的列值,以及相应的标题?理想情况下,生成具有唯一列的新数据帧会很好。
特别是,有没有办法使用集合操作?
谢谢。
答案 0 :(得分:2)
这是一个快速解决方案,只返回前两行不同的列。
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
答案 1 :(得分:1)
你真的不需要索引,你可以比较两行并使用它来过滤列表理解列。
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)