簡體   English   中英

將數據幀第一行的單元格值與其他行的單元格值進行比較

[英]Compare cell value of first row of a dataframe to cell value of other rows

我有一個數據場,它有 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,…

我不確定如何有效地做到這一點。 我沒有找到任何類似於這個問題的答案。 對不起,如果我問重復的問題。 先感謝您!

設置

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)

這是一種方法:

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

我假設您想要與第一行不匹配的列名列表:

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

200 行足夠小,因此apply(..., axis=1)不是性能問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM