如何使用pandas返回排序行的索引值?

2 投票
1 回答
5204 浏览
提问于 2025-04-17 17:27

我最近发现了pandas的强大功能。(感谢Wes McKinney!)我有一个csv文件,里面包含以下信息:

RUN_START_DATE,PUSHUP_START_DATE,SITUP_START_DATE,PULLUP_START_DATE
2013-01-24,2013-01-02,2013-01-30,2013-02-03
2013-01-30,2013-01-21,2013-01-13,2013-01-06
2013-01-29,2013-01-28,2013-01-01,2013-01-29
2013-02-16,2013-02-12,2013-01-04,2013-02-11
2013-01-06,2013-02-07,2013-02-25,2013-02-12
2013-01-26,2013-01-28,2013-02-12,2013-01-10
2013-01-26,2013-02-10,2013-01-12,2013-01-30
2013-01-03,2013-01-24,2013-01-19,2013-01-02
2013-01-22,2013-01-13,2013-02-03,2013-02-05
2013-02-06,2013-01-16,2013-02-07,2013-01-11

通常情况下,我不会用pandas来处理这个过程。我会使用csv库来生成列表。然后用datetime库进行转换。接着,我会遍历每一行,运行类似下面的代码来获取每一行的排序索引:

'"' + ','.join(map(str, sorted(range(len(dates)), key=lambda k: dates[k]))) + '"'

这样每一行就会返回类似这样的结果:

Out[40]: '"1,0,2,3"'

然后我会把这个结果作为新字段添加到csv的每一行末尾。

我可以把csv读入pandas,并把里面的项目转换为日期类型。但我不太确定如何用pandas获取排序索引的值,然后把它们变成字符串放到一列里?任何帮助都非常感谢!

1 个回答

8

你可以使用 numpy.argsort() 来获取排序的索引:

from StringIO import StringIO
import numpy as np
import pandas as pd

txt = """RUN_START_DATE,PUSHUP_START_DATE,SITUP_START_DATE,PULLUP_START_DATE
2013-01-24,2013-01-02,2013-01-30,2013-02-03
2013-01-30,2013-01-21,2013-01-13,2013-01-06
2013-01-29,2013-01-28,2013-01-01,2013-01-29
2013-02-16,2013-02-12,2013-01-04,2013-02-11
2013-01-06,2013-02-07,2013-02-25,2013-02-12
2013-01-26,2013-01-28,2013-02-12,2013-01-10
2013-01-26,2013-02-10,2013-01-12,2013-01-30
2013-01-03,2013-01-24,2013-01-19,2013-01-02
2013-01-22,2013-01-13,2013-02-03,2013-02-05
2013-02-06,2013-01-16,2013-02-07,2013-01-11"""
df = pd.read_csv(StringIO(txt))
idx = np.argsort(df, axis=1)
buf = StringIO()
idx.to_csv(buf, index=False, header=False)
print buf.getvalue()

输出结果:

1,0,2,3
3,2,1,0
2,1,0,3
2,3,1,0
0,1,3,2
3,0,1,2
2,0,3,1
3,0,2,1
1,0,2,3
3,1,0,2

撰写回答