熊猫:对子组中的数据帧进行排序,排序相等的值

时间:2016-10-31 18:17:42

标签: python sorting pandas

我正在尝试解决以下问题。 我有以下数据框df = pd.DataFrame({'A': ['id1', 'id1', 'id2', 'id2', 'id2','id2', 'id2', 'id2','id2', 'id3', 'id3', 'id3'] , 'B': [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21] , 'C': [101 , 32, 10, 9, 15, 15, 15, 15, 15, 40, 36, 36]} ) df Out[16]: A B C 0 id1 10 101 1 id1 11 32 2 id2 12 10 3 id2 13 9 4 id2 14 15 5 id2 15 15 6 id2 16 15 7 id2 17 15 8 id2 18 15 9 id3 19 40 10 id3 20 36 11 id3 21 36

C

我现在希望重新排列数据框,以便列A中的值按照列df2 = df df2 = df2.sort_values(by=['A','C'], ascending=True).groupby('A').head() 中的id值定义的每个子组按升序排序。我使用以下代码:

df2
Out[18]: 
      A   B    C
1   id1  11   32
0   id1  10  101
3   id2  13    9
2   id2  12   10
4   id2  14   15
5   id2  15   15
6   id2  16   15
10  id3  20   36
11  id3  21   36
9   id3  19   40

我得到了这个:

C

id1中的子组A对应的id3中的值已全部正确排序,以及与子组C对应的值。但是,col id2中col A相对于print len(df.index), len(df2.index) 12 10 的排序操作已跳过两行......

public class WriteFileService {
  private String fileTeachers="/mylocation/teachers.txt";
  private String fileCourses="/mylocation/courses.txt";

  public void writeToFileTeacher (String course) {
    writeToFileCommon(course, fileTeachers);
  }

 public void writeToFileCourse(String course) {
    writeToFileCommon(course, fileCourses);
  }

 private void writeToFileCommon(String course, String file) {
  try (FileWriter fw = new FileWriter(file, true);
         BufferedWriter bw = new BufferedWriter(fw);
         PrintWriter out = new PrintWriter(bw)) {
      out.println(course);// this is what gets saved
    } catch (IOException e) {
    }        
 }
}

知道为什么会发生这种情况以及如何解决这个问题? 很感谢任何形式的帮助。

谢谢, MarcoC

2 个答案:

答案 0 :(得分:2)

因为你的.groupby('A').head().head只显示DataFrame的前5行。它只返回组'id2'的前5行。移除.head,您将得到正确答案:

df2 = df2.sort_values(by=['A','C'], ascending=True).groupby('A') # Note, no .head()
print len(df.index), len(df2.index)
12 12

答案 1 :(得分:1)

我认为您只需要DataFrame.sort_values

df2=df.sort_values(by=['A','C'], ascending=True)
print (df2)
      A   B    C
1   id1  11   32
0   id1  10  101
3   id2  13    9
2   id2  12   10
4   id2  14   15
5   id2  15   15
6   id2  16   15
7   id2  17   15
8   id2  18   15
10  id3  20   36
11  id3  21   36
9   id3  19   40

您删除行,因为默认情况下head(5) - 每组仅获得最多5行。