我是Python和Pandas的新手,并且已经提取了一个包含15个以上不同datetime列的数据库表。我的任务是按照最早到最新的值对这些列进行排序。但是,数据并不干净。有时,在第0行中A列的日期早于B列的日期,而在第1行中A的日期晚于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之前。
该order_date_columns()
函数成功地按正确的顺序对两列进行了排序,但是如何将这种排序一次应用于15个以上的列?我研究了df.apply()
,,lambda
和map()
,但未能解决此问题。
任何帮助(以及代码的清晰性/效率)也将不胜感激!
由于您使用的是Python 2.7,因此可以使用cmp
关键字参数sorted
。为了按您想要的顺序获取列名,我将执行以下操作:
# Returns -1 if first_column[i] > second_column[i] more often.
# Returns 1 if vice versa.
# Returns 0 if equal.
# Assumes df[first_column] and df[second_column] are the same length.
def compare_two(first_column, second_column):
c1_greater_count = 0
c2_greater_count = 0
# Iterate over the two columns in the dataframe. df must be in accessible scope.
for i in range(len(df[first_column])):
if df[first_column].iloc(i) > df[second_column].iloc[i]:
c1_greater_count += 1
elif df[second_column].iloc[i] > df[first_column].iloc[i]:
c2_greater_count += 1
if c1_greater_count > c2_greater_count:
return -1
if c2_greater_count > c1_greater_count:
return 1
return 0
df = get_dataframe_from_somewhere()
relevant_column_names = get_relevant_column_names(df) # e.g., get all the dates.
sorted_column_names = sorted(relevant_column_names, cmp=compare_two)
# sorted_column_names holds the names of the relevant columns,
# sorted according to the given ordering.
我敢肯定,还有一种更Python化的方法可以做到这一点,但这应该行得通。请注意,对于Python 3,可以使用该cmp_to_key
实用程序。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句