比较pandas数据框的行(行有一些重叠的值)

2024-04-20 11:19:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含21列的pandas数据框。我关注的是行的一个子集,这些行具有完全相同的列数据值,除了每行唯一的6个列数据值。我不知道这6个值对应于先验的列标题。

我尝试将每一行转换为索引对象,并对两行执行了set操作。例如

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

它返回一个索引对象,该对象包含第1行独有的值。然后我可以手动推断哪些列具有唯一值。

如何以编程方式获取这些值在初始数据帧中对应的列标题?或者,是否有方法比较两个或多个数据帧行并提取每行的6个不同列值以及相应的标题?理想情况下,最好生成一个具有唯一列的新数据帧。

特别是,有没有办法使用set操作来实现这一点?

谢谢你。


Tags: 数据sample对象标题pandasdataindex手动
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

您实际上不需要索引,只需比较两行,然后使用它来筛选具有列表理解功能的列。

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)

相关问题 更多 >