如何按不在数据框中的数组对数据框进行排序

2024-01-17

我已经在不同的上下文中多次回答过这个问题,并且我意识到在任何地方都没有指定好的规范方法。

因此,设置一个简单的问题:

Problem

df = pd.DataFrame(dict(A=range(6), B=[1, 2] * 3))
print(df)

   A  B
0  0  1
1  1  2
2  2  1
3  3  2
4  4  1
5  5  2

问题:

如何按列的乘积排序 'A' and 'B'?


TL;DR
iloc + argsort


我们可以使用以下方法来解决这个问题iloc http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.iloc.html我们可以在其中获取序数位置数组并返回按这些位置重新排序的数据帧。

凭借的力量iloc http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.iloc.html, 我们可以sort与任何指定顺序的数组。

现在,我们需要做的就是确定获取此排序的方法。原来有一个方法叫做argsort http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.argsort.html这正是这样做的。通过传递结果argsort http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.argsort.html to iloc http://pandas.pydata.org/pandas-docs/version/0.17.0/generated/pandas.DataFrame.iloc.html,我们可以整理我们的数据框。

实施例1

使用上面指定的问题

df.iloc[df.prod(1).argsort()]

与上面的结果相同

   A  B
0  0  1
1  1  2
2  2  1
4  4  1
3  3  2
5  5  2

这是为了简单起见。如果性能是一个问题,我们可以进一步采取这一措施,并重点关注numpy

v = df.values
a = v.prod(1).argsort()
pd.DataFrame(v[a], df.index[a], df.columns)

这些解决方案的速度有多快?

我们可以看到pd_ext_sort是最简洁的,但扩展性不如其他。
np_ext_sort以牺牲透明度为代价提供最佳性能。不过,我认为发生的事情仍然非常清楚。

回测设置

def add_drop():
    return df.assign(P=df.prod(1)).sort_values('P').drop('P', 1)

def pd_ext_sort():
    return df.iloc[df.prod(1).argsort()]

def np_ext_sort():
    v = df.values
    a = v.prod(1).argsort()
    return pd.DataFrame(v[a], df.index[a], df.columns)

results = pd.DataFrame(
    index=pd.Index([10, 100, 1000, 10000], name='Size'),
    columns=pd.Index(['add_drop', 'pd_ext_sort', 'np_ext_sort'], name='method')
)

for i in results.index:
    df = pd.DataFrame(np.random.rand(i, 2), columns=['A', 'B'])
    for j in results.columns:
        stmt = '{}()'.format(j)
        setup = 'from __main__ import df, {}'.format(j)
        results.set_value(i, j, timeit(stmt, setup, number=100))

results.plot()

实施例2

假设我有一列负值和正值。我想按增加的幅度进行排序......但是,我希望负面因素首先出现。

假设我有数据框df

df = pd.DataFrame(dict(A=range(-2, 3)))
print(df)

   A
0 -2
1 -1
2  0
3  1
4  2

我会再次设置3个版本。这次我要用np.lexsort它返回与以下相同类型的数组argsort。意思是,我可以用它来重新排序数据框。

Caveat: np.lexsort首先按列表中的最后一个数组排序。\shurg

def add_drop():
    return df.assign(P=df.A >= 0, M=df.A.abs()).sort_values(['P', 'M']).drop(['P', 'M'], 1)

def pd_ext_sort():
    v = df.A.values
    return df.iloc[np.lexsort([np.abs(v), v >= 0])]

def np_ext_sort():
    v = df.A.values
    a = np.lexsort([np.abs(v), v >= 0])
    return pd.DataFrame(v[a, None], df.index[a], df.columns)

全部返回

   A
1 -1
0 -2
2  0
3  1
4  2

这次有多快?

在这个例子中,两者pd_ext_sort and np_ext_sort表现优于add_drop.

回测设置

results = pd.DataFrame(
    index=pd.Index([10, 100, 1000, 10000], name='Size'),
    columns=pd.Index(['add_drop', 'pd_ext_sort', 'np_ext_sort'], name='method')
)

for i in results.index:
    df = pd.DataFrame(np.random.randn(i, 1), columns=['A'])
    for j in results.columns:
        stmt = '{}()'.format(j)
        setup = 'from __main__ import df, {}'.format(j)
        results.set_value(i, j, timeit(stmt, setup, number=100))

results.plot(figsize=(15, 6))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何按不在数据框中的数组对数据框进行排序 的相关文章

随机推荐

  • mixReducer 中使用的减速器的声纳代码气味

    我正在使用combineReducers来组合reducers和reducer 如下所示 const todo state action gt switch action type case TOGGLE TODO if state id
  • Spring Boot 无法使用 Java 配置更改 Thymeleaf 模板目录

    将 Thymeleaf 模板文件放置在默认值中src main resources templates对我来说工作正常 当我想重命名目录时说mytemplates 这是行不通的 我收到找不到模板位置 classpath templates
  • JavaScript:获取图像尺寸

    我只有一个图像的 URL 我需要仅使用 JavaScript 确定该图像的高度和宽度 用户在页面上无法看到该图像 我怎样才能得到它的尺寸 var img new Image img onload function var height im
  • 如何将符号链接文件添加到 gitlab 存储库

    如何将文件的符号链接添加到 gitlab 存储库 每次我从 gitlab 运行管道时 本地符号链接都会被破坏 任何关于如何为 gitlab repo 内部的文件夹创建符号链接的建议都会很棒 您可以在 Git 存储库中存储符号链接 特殊条目
  • CSS3边框半径简写解决方案

    Is this border radius 10px 10px 0 0 一个缩短的版本 适用于所有识别它的浏览器 border top left radius 10px border top right radius 10px 是的 第一种
  • 具有唯一约束的 Postgres 哈希索引

    由于 Postgres 10 正确支持哈希索引 我想使用哈希索引进行 id 查找 与 btree 相比 哈希索引的大小更小 理论上更快 我有一张桌子 create table t id int create unique index on
  • 使用前瞻的 C++ std::regex 失败

    我需要从磁盘解析 txt 文件 所以我首先做了一个例子来测试正则表达式 这是我的示例代码 std string txt paragraph r nthis is the text file r ni need only this data
  • 为我的网站创建“徽章”,存储用户徽章的最佳方式?使用PHP

    我正在向我的网站添加 徽章 我想知道存储数据的最佳方式是什么 每个徽章都有一个存储在 MySQL 数据库中的 ID 每个用户在 MySQL 数据库中都有自己的行 并且每个用户都有一个 XML 格式的 userdata 文件 因此 我可以将其
  • SONAR:将此 lambda 替换为方法引用

    Sonar 告诉我 用方法引用替换这个 lambda public class MyClass private List
  • 如何使用 iText 和 Flying Saucer 在从 HTML 创建的 PDF 中嵌入字体?

    我在将波兰语字体嵌入从 HTML 转换为 PDF 时遇到问题 我的 HTML 代码正文有样式 我尝试了两种将此类 HTML 转换为 PDF 的方法 FOP 与 htmlcleaner 带飞碟的 iText 对于 FOP 我可以将所有使用的字
  • 在iOS swift中查看录音?

    是否有任何库可以记录特定的活动UIView 我遇到了这个库 ASScreenRecorder master 但当我尝试在 swift 中使用它或任何其他方式记录时 它显示出许多错误UIView哪个正在显示一些动画 例如飘落的雪花和图像的幻灯
  • Django 中的值相对于前一个值自动递增

    有没有一种方法可以相对于前一个字段自动递增字段 例如 如果前一个记录的值为 09 0001 那么下一个记录应该分配为 09 0002 等等 想法 我正在考虑重写保存方法 但我不太确定到底如何 Django 不允许您在模型中拥有多个 Auto
  • pySpark Columnsimilarities 的问题

    太长了 博士 如何使用 pySpark 比较行的相似度 我有一个 numpy 数组 我想在其中比较每一行之间的相似性 print pdArray 0 1 0 0 0 0 0 0 3 0 0 0 0 0 0 0 0 7 5 0 0 0 1 0
  • java 是否缓存方法的结果

    I useJMH指定操作的复杂度 如果您从未与 JMH 合作过 请不要担心 JMH 将刚刚推出estimateOperation方法多次 然后得到平均时间 问题 缩小 这个程序会计算Math cbrt Integer MAX VALUE 每
  • Android MediaPlayer 在某些设备上不播放声音

    我为我的应用程序发出了简单的警报声 但问题是声音在某些设备上播放 而在其他设备上则不播放 示例代码如下 public void audioPlayer leshon tingull kur ka kolision Armando 8 7 2
  • 如何隐藏或加密 JavaScript 代码? [复制]

    这个问题在这里已经有答案了 有没有办法隐藏或加密 JavaScript 代码以防止人们查看 复制和 或修改专有程序 您可以混淆它 但没有办法完全保护它 混淆器示例 https obfuscator io https obfuscator i
  • C# 枚举标志比较

    给定以下标志 Flags public enum Operations add 1 subtract 2 multiply 4 divide 8 eval 16 如何实现 IF 条件来执行每个操作 在我的尝试中 第一个条件适用于添加 评估
  • Office Web 应用程序 - 删除按钮

    有没有办法从 Office Web 应用程序中删除按钮或完整功能区 我想删除下载 添加到一个驱动器等 示例网址如下 https view officeapps live com op view aspx src www cse lehigh
  • jQuery AJAX - 意外的标记 + 解析器错误

    我今天使用 jQuery 和 AJAX 编写了一个脚本 但出现了一些错误 剧本 function changeAdmin id document ready function ta modarea id fadeOut fast ta m
  • 如何按不在数据框中的数组对数据框进行排序

    我已经在不同的上下文中多次回答过这个问题 并且我意识到在任何地方都没有指定好的规范方法 因此 设置一个简单的问题 Problem df pd DataFrame dict A range 6 B 1 2 3 print df A B 0 0