![](/img/trans.png)
[英]Need to update a pandas dataframe row based on cell value. Also, if 2 rows have same cell value, need to update only the first
[英]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_suffix
和Series.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.