我是Python和Pandas的新手,我已经拉入了一个包含15个以上不同日期时间列的数据库表。我的任务是通常按行中的最新值排序这些列。但是,数据并不干净。有时候,A列的日期会在第0行的B列日期之前出现,A会在第1行的B之后出现。如何在Pandas数据框中按行值对日期时间列进行排序?
我编写了几个函数(为简单起见,此处编辑)通过计算时间百分比在一个日期来之前和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]
我与上面的代码的目标是通过编程实现以下:
如果柱A日期到来在Col B日期为50 +%的时间之前,Col A应该在t之前的Col B之前他列出了最早的日期时间列。
的order_date_columns()
函数成功排序两列到正确的顺序,但我怎么一次将这个排序到15+列?我查看了df.apply()
,lambda
和map()
,但未能解决此问题。
任何帮助(与代码的清晰度/效率),将不胜感激!
为了记录,我使用了Anaconda的Python 2.7.12。 – alemosie