我是Python和Pandas的新手,我已经在数据库表中提取了15个不同的日期时间列。我的任务是通常按行中的最新值到最新值对这些列进行排序。但是,数据不干净;有时,如果A栏的日期在第0行的B列日期之前,A将出现在第1行的B之后。
我编写了一些函数(为简单起见,在这里进行了编辑),通过计算A之前和之后B中日期的百分比来比较两列,然后根据该百分比对列进行排序:
def get_percentage(df, df_subset):
return len(df_subset)/float(len(df))
def duration_report(df, earlier_column, later_column):
results = {}
td = df[later_column] - df[earlier_column]
results["Before"] = get_percentage(df, df.loc[td >= pd.Timedelta(0)])
results["After"] = get_percentage(df, df.loc[td <= pd.Timedelta(0)])
ind = "%s vs %s" % (earlier_column, later_column)
return pd.DataFrame(data=results, index=[ind])
def order_date_columns(df, col1, col2):
before = duration_report(df, col1, col2).Before.values[0]
after = duration_report(df, col1, col2).After.values[0]
if before >= after:
return [col1, col2]
else:
return [col2, col1]
上述代码的目标是以编程方式实现以下内容:
如果Col A日期在Col B日期50 +%的时间之前到来,则Col A应该在Col B的最早到最晚的datetime列的列表之前。
order_date_columns()
函数成功地将两列排序为正确的顺序,但如何将此排序一次应用于15+列?我已经查看了df.apply()
,lambda
和map()
,但还没有能够解决这个问题。
任何帮助(代码清晰度/效率)都将不胜感激!
答案 0 :(得分:2)
如果您不介意使用一些快捷方式并使用每个日期列的中位数,这应该有效:
def order_date_columns(df, date_columns_to_sort):
x = [(col, df[col].astype(np.int64).median()) for col in date_columns_to_sort]
return [x[0] for x in sorted(x, key=lambda x: x[1])]
答案 1 :(得分:1)
由于您使用的是Python 2.7,因此可以使用<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
<svg width="1000" height="1000" id="this_svg">
<rect x="0" y="0" width="100" height="100" fill="blue" data-color="red"> </rect>
<rect x="0" y="100" width="100" height="100" fill="green" data-color="purple"></rect>
</svg>
关键字参数cmp
。要按照您要查找的顺序获取列名称,我会执行以下操作:
sorted
我确信有更多的Pythonic方法可以做到,但这应该有效。请注意,对于Python 3,您可以使用cmp_to_key
实用程序。