首页 > 解决方案 > 将数据框第一行的单元格值与其他行的单元格值进行比较

问题描述

我有一个数据农场,它有 50 列和超过 200 行的二进制值:

 
a1 a2 a3 a4 ..... a50
0 1 0 1 ..... 1
1 0 0 1 …… 0
0 1 1 0 …. 0
1 1 1 0 …。1

我想将第一行的单元格值与其他行逐一进行比较,并使第 51 列输出不匹配的单元格,如下所示:(由于第一行不与任何行进行比较,它将得到一个 nan 值)

 
a51
南
a1,a2,…,a50
a3,a4…,a50
a1,a3,a4,…

我不确定如何有效地做到这一点。我还没有找到任何类似这个问题的答案。对不起,如果我问重复的问题。先感谢您!

标签: pythonpandasdataframe

解决方案


设置

import numpy as np
df = pd.DataFrame(np.random.randint(2,size=(200,50)),
                  columns =[f'a{i}' for i in range(1,51)])

Series.dot+DataFrame.add_suffixSeries.str.rstrip

df['a51']=df.iloc[1:].ne(df.iloc[0]).dot(df.add_suffix(', ').columns).str.rstrip(', ')

50列200行时间比较

%%timeit
df['a51'] = df.iloc[1:].ne(df.iloc[0]).dot(df.add_suffix(', ').columns).str.rstrip(', ')
25.4 ms ± 681 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)


%%timeit
a = df.to_numpy()
m = np.where(a[0,:] != a[1:,None], df.columns, np.nan)
pd.DataFrame(m.squeeze()).stack().groupby(level=0).agg(', '.join)
41.1 ms ± 4.16 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)


%%timeit
df.iloc[1:].apply(lambda row: df.columns[df.iloc[0] != row].values, axis=1)
147 ms ± 18.9 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)

推荐阅读