python - 将数据框第一行的单元格值与其他行的单元格值进行比较
问题描述
我有一个数据农场,它有 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,…
我不确定如何有效地做到这一点。我还没有找到任何类似这个问题的答案。对不起,如果我问重复的问题。先感谢您!
解决方案
设置
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)
推荐阅读
- javascript - 打开与 url 匹配的选项卡时启用 chrome 扩展
- javascript - 使用 javascript 访问表单元素
- jwt - 验证后验证 JWT 有效负载是否是最佳实践?
- python - 在 NumPy 1.14 中将结构化数组的切片转换为常规 NumPy 数组
- email - 在没有先前线程的情况下在 Odoo 11 中处理电子邮件——这可能吗?
- twitter-bootstrap-3 - 如何在同一个应用程序中使用 yii2-bootstrap4 扩展和 bootstrap 3
- regex - 自定义标签的正则表达式帮助
- sorting - Powershell“LastWriteTime”不起作用
- opencv - detectMutliScale opencv 错误
- sql - 在 SQL Server 中将分层数据转换为路径样式平面(分支)样式