根据元组索引排序行

huangapple go评论94阅读模式
英文:

Sort Rows Based on Tuple Index

问题

Lambda函数如下,它可以根据第3个元组索引元素的相应'Num'值进行排序:

  1. dataTable = dataTable.reindex(sorted(dataTable.index, key=lambda x: (not isinstance(x, tuple), x, -dataTable.loc[x, 'Num'])))
英文:

Overview:

Pandas dataframe with a tuple index and corresponding 'Num' column:

  1. Index Num
  2. ('Total', 'A') 23
  3. ('Total', 'A', 'Pandas') 3
  4. ('Total', 'A', 'Row') 7
  5. ('Total', 'A', 'Tuple') 13
  6. ('Total', 'B') 35
  7. ('Total', 'B', 'Rows') 12
  8. ('Total', 'B', 'Two') 23
  9. ('Total', 'C') 54
  10. ('Total', 'C', 'Row') 54
  11. Total 112

The index and 'Num' column are already sorted with a lambda function by Alphabetical Order and based on the length of tuple elements:

  1. dataTable = dataTable.reindex(sorted(dataTable.index, key=lambda x: (not isinstance(x, tuple), x)))

Problem:

Now, I want to sort only the 3rd tuple index element based on it's corresponding 'Num' value. Here would be an updated example of the dataframe:

  1. Index Num
  2. ('Total', 'A') 23
  3. ('Total', 'A', 'Tuple') 13
  4. ('Total', 'A', 'Row') 7
  5. ('Total', 'A', 'Pandas') 3
  6. ('Total', 'B') 35
  7. ('Total', 'B', 'Two') 23
  8. ('Total', 'B', 'Rows') 12
  9. ('Total', 'C') 54
  10. ('Total', 'C', 'Row') 54
  11. Total 112

Question:

What Lambda function can achieve this?

答案1

得分: 1

  1. 您可以尝试
  2. ```py
  3. def fn(x):
  4. vals = x.sort_values(by='Num', ascending=False)
  5. df.loc[x.index] = vals.values
  6. m = df['Index'].apply(len).eq(3)
  7. df[m].groupby(df.loc[m, 'Index'].str[1], group_keys=False).apply(fn)
  8. print(df)

打印:

  1. Index Num
  2. 0 (Total, A) 23
  3. 1 (Total, A, Tuple) 13
  4. 2 (Total, A, Row) 7
  5. 3 (Total, A, Pandas) 3
  6. 4 (Total, B) 35
  7. 5 (Total, B, Two) 23
  8. 6 (Total, B, Rows) 12
  9. 7 (Total, C) 54
  10. 8 (Total, C, Row) 54
  11. 9 Total 112

初始 df

  1. Index Num
  2. 0 (Total, A) 23
  3. 1 (Total, A, Pandas) 3
  4. 2 (Total, A, Row) 7
  5. 3 (Total, A, Tuple) 13
  6. 4 (Total, B) 35
  7. 5 (Total, B, Rows) 12
  8. 6 (Total, B, Two) 23
  9. 7 (Total, C) 54
  10. 8 (Total, C, Row) 54
  11. 9 Total 112
  1. <details>
  2. <summary>英文:</summary>
  3. You can try:
  4. ```py
  5. def fn(x):
  6. vals = x.sort_values(by=&#39;Num&#39;, ascending=False)
  7. df.loc[x.index] = vals.values
  8. m = df[&#39;Index&#39;].apply(len).eq(3)
  9. df[m].groupby(df.loc[m, &#39;Index&#39;].str[1], group_keys=False).apply(fn)
  10. print(df)

Prints:

  1. Index Num
  2. 0 (Total, A) 23
  3. 1 (Total, A, Tuple) 13
  4. 2 (Total, A, Row) 7
  5. 3 (Total, A, Pandas) 3
  6. 4 (Total, B) 35
  7. 5 (Total, B, Two) 23
  8. 6 (Total, B, Rows) 12
  9. 7 (Total, C) 54
  10. 8 (Total, C, Row) 54
  11. 9 Total 112

Initial df:

  1. Index Num
  2. 0 (Total, A) 23
  3. 1 (Total, A, Pandas) 3
  4. 2 (Total, A, Row) 7
  5. 3 (Total, A, Tuple) 13
  6. 4 (Total, B) 35
  7. 5 (Total, B, Rows) 12
  8. 6 (Total, B, Two) 23
  9. 7 (Total, C) 54
  10. 8 (Total, C, Row) 54
  11. 9 Total 112

huangapple
  • 本文由 发表于 2023年6月2日 01:05:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/76384189.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定