比较数据帧第一行的单元格值和其他行的单元格值

2024-06-02 19:07:22 发布

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

我有一个datafarme,它有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
NAN
a1,a2,…,a50
a3,a4…,a50
a1,a3,a4,…

我不知道如何有效地做到这一点。我没有找到任何类似于这个问题的答案。对不起,如果我问的是重复的问题。提前谢谢你


Tags: 答案a2a1二进制nana3a4a50
1条回答
网友
1楼 · 发布于 2024-06-02 19:07:22

这里有一种方法:

import numpy as np

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)

0    a1, a2, a50
1    a3, a4, a50
2     a1, a3, a4
dtype: object

输入数据:

print(df)

   a1  a2  a3  a4  a50
0   0   1   0   1    1
1   1   0   0   1    0
2   0   1   1   0    0
3   1   1   1   0    1
网友
2楼 · 发布于 2024-06-02 19:07:22

我假设您需要与第一行不匹配的列名列表:

df['a51'] = df.iloc[1:].apply(lambda row: df.columns[df.iloc[0] != row].values, axis=1)

200行足够小,因此apply(..., axis=1)不是性能问题

网友
3楼 · 发布于 2024-06-02 19:07:22

设置

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

^{}+^{}^{}

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)

相关问题 更多 >