我有一个像这样的数据框:
id A B Percentage
1 3333311 12 days 6 days 0.41
3953 3455572 35 days 31 days 0.36
46458 6464544 36 days 33 days 0.36
39378 2323322 56 days 46 days 0.42
115880 2222111 54 days 44 days 0.25
115882 4333311 44 days 16 days 0.56
118882 5454566 56 days 41 days 0.25
118884 3321767 54 days 42 days 0.42
我想先按百分比对它进行排序。
然后,当抢七局出现时,它应该同时在A和B上进行排序
if A.iloc[1] < A.iloc[2]
and B.iloc[1] < B.iloc[2]
then df.iloc[2] should come first and vice versa.
But if A.iloc[1] < A.iloc[2]
and B.iloc[1] > A.iloc[2]
or if A.iloc[1] > A.iloc[2]
and B.iloc[1] < A.iloc[2]
预期的输出将如下所示:
id A B Percentage
115882 4333311 44天16天0.56 39378 2323322 56天46天0.42 118884 3321767 54天42天0.42 1 3333311 12天6天0.41 46458 6464544 36天33天0.36 3953 3455572 35天31天0.36 118882 5454566 56天41天0.25 115880 2222111 54天44天0.25
现在在0.25%抢七局中,情况是:
如果A.iloc [118882]> A.iloc [115880]
和B.iloc [118882] 在这里,我们将执行其他操作并考虑其他汇总。
答案 0 :(得分:0)
这是我的建议,
df = pd.DataFrame({'id':[3333311,3455572,6464544,2323322,2222111],'A':['43 days','44 days','44 days','44 days','45 days'],'B':['9 days','13 days','8 days','7 days','8 days'],'Percentage':[0.044342,0.053222,0.052442,0.044342,0.052632]})
# removing 'days' string from columns
df.A = df.A.apply(lambda x: x.split()[0])
df.B = df.B.apply(lambda x: x.split()[0])
# sorting by values
df.sort_values(by='Percentage').sort_values(by='A').sort_values(by='B')
最终输出:
Out[1]: id A B Percentage 1 3455572 44 13 0.053222 3 2323322 44 7 0.044342 2 6464544 44 8 0.052442 4 2222111 45 8 0.052632 0 3333311 43 9 0.044342
答案 1 :(得分:0)
您可以将排序和要执行的操作分为两个不同的步骤。
获取排序的数据框为:
sorted_df = df.sort_values(['Percentage', 'A', 'B'])
但是要根据条件执行所需的操作,请仅基于百分比排序。创建另一个数组perc_prev,其中包含上一列的值,并使用它来查找领带的索引
df_perc_sorted = df.sort_values('Percentage')
perc_prev = np.hstack(([-1], df['Percent'].values[1:]))
# use the boolean value in the tie array to figure out if there was a tie
tie = perc_prev == df['Percetange']
# similarly create boolean columns to figure out the condition you need