python - Pandas-创建差异矩阵的数量
问题描述
我有一个这样的数据框
L1 L2 L3 L4 L5
A 1 2 3 4 5
B 1 2 4 3 5
C 1 3 3 2 1
我想计算行之间的差异数,例如A和B之间的差异数是2,A和C是3,B和C是4。
我真正想要的是一个差异矩阵,例如
A B C
A 0 2 3
B 2 0 4
C 3 4 0
解决方案
第一个循环解决方案是按每一行迭代,按 DataFrame 和比较sum
:
df = df.apply(lambda x: df.ne(x).sum(axis=1), axis=1)
print (df)
A B C
A 0 2 3
B 2 0 4
C 3 4 0
或者为了提高性能,将 numpy 中的值与 3d 数组的广播进行比较, sum 和 last 使用 DataFrame 构造函数:
a = df.to_numpy()
out = pd.DataFrame((a != a[:, None]).sum(2), index=df.index, columns=df.index)
print (out)
A B C
A 0 2 3
B 2 0 4
C 3 4 0
np.random.seed(123)
df = pd.DataFrame( np.random.randint(20, size=(100, 500)))
print (df)
In [119]: %%timeit
...: df.apply(lambda x: df.ne(x).sum(axis=1), axis=1)
...:
...:
12.8 s ± 1.02 s per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [120]: %%timeit
...: a = df.to_numpy()
...: pd.DataFrame((a != a[:, None]).sum(2), index=df.index, columns=df.index)
...:
...:
14.6 ms ± 325 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
推荐阅读
- java - 为什么在 Thread 中使用 map 来存储 ThreadLocal 对象?
- python - 使用format方法修改student_grade函数,
- python - Tensoflow Keras - 具有 sparse_categorical_crossentropy 的 Nan 损失
- python-3.x - 如何在python中自动化曲线拟合过程?
- java - 无法在 Java Selenium Headless 浏览器的新窗口中捕获文本
- android - 为什么我的视频在 Android 的某些设备中播放 Anti roitation 是统一构建的
- javascript - JavaScript - 如何在某些条件下获取数组值?
- c# - DependencyResolutionException:没有找到类型为“Autofac.Core.Activators.Reflection.DefaultConstructorFinder”的构造函数
- python-3.x - 如何将移动平均函数应用于多元时间序列模型
- perl - 在字符串后的文件中插入换行符