我正在尝试解决以下问题。
我有以下数据框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
答案 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
行。