![](/img/trans.png)
[英]pandas - unstack with most frequent values in MultiIndex DataFrame
[英]Python, Pandas; Sort Dataframe rows by most frequent values in a column
我有一個類似於此的 dataframe:
A B C D E F
0 4 422 470 101 4100 410000
1 4 422 470 101 4100 410000
2 4 422 470 101 4100 410000
3 4 422 470 101 4100 410000
4 4 422 470 101 4100 410000
... ... ... ... ... ... ...
33831 4 426 4ZD 4ZD 4989 498999
33832 4 426 4ZD 4ZD 4989 498999
33833 4 426 4ZD 4ZD 4989 498999
33834 4 426 4ZD 4ZD 4989 498999
33835 4 426 4ZD 4ZD 4989 498999
數據框應該顯示從 A -> B -> C -> D -> E 的父子關系。E 中的每個子項在 D 中應該只有一個父項,D 到 C 等。但是,有E 中的孩子被誤認為有不同的父母,我需要找到並注意。
# Remove duplicate rows to get the distinct relationships.
dfdrop = df.drop_duplicates()
print(dfdrop)
Output:
0 4 422 470 101 4100 410000
49 4 422 411 419 4102 410200
243 4 422 411 419 4103 410300
331 4 422 411 420 4108 410800
471 4 422 411 120 4120N 410900
... ... ... ... ... ... ...
33556 4 40 493 477 4970 497700
33727 4 40 493 477 4BE 497800
33752 4 40 457 4YR 4636 497900
33799 4 40 493 485 4982 498299
33822 4 426 4ZD 4ZD 4989 498999
[570 rows x 6 columns]
因為如果譜系中存在錯誤,E 列總是會重復,所以我嘗試按 E 列值的頻率對數據進行分組,並按大多數父子問題將它們排序到最少。 下面,計數表示需要審查的記錄。 計數為 1 表示該記錄沒有父子問題。
dfgroups = dfdrop.groupby(['E']).size().reset_index().rename(columns={0:'count'})
print(dfgroups.sort_values(['count'], ascending=False).head(45))
Output:
E count
302 446099 4
53 418500 4
135 430130 3
459 474700 3
481 493099 3
496 496200 3
47 417500 3
448 472900 3
52 418400 3
435 470599 3
362 456099 3
60 419400 3
39 416099 2
483 493399 2
482 493199 2
170 433100 2
294 445300 2
234 439100 2
40 416100 2
361 455900 2
488 495399 2
313 448600 2
45 417300 2
411 463900 2
473 481600 2
61 419900 2
314 448700 2
489 495499 2
255 441100 2
327 450400 2
138 430300 2
253 440900 2
134 430099 2
431 470099 2
19 413400 2
136 430200 2
495 496199 2
493 495899 2
86 423400 2
338 452100 1
335 451800 1
349 453400 1
350 453500 1
334 451700 1
337 452099 1
現在,這告訴我 E 中的哪些值是重復的並且需要記錄。 但是,我需要顯示所有列並訂購 dataframe 以便與未命中的記錄匹配父子關系。 理想情況下,它看起來像這樣:
0 4 422 470 101 4100 446099
49 4 422 411 419 4102 446099
243 4 422 411 419 4103 446099
331 4 422 411 420 4108 446099
471 4 422 411 120 4120N 418500
... ... ... ... ... ... ...
33556 4 40 493 477 4970 496199
33727 4 40 493 477 4BE 495899
33752 4 40 457 4YR 4636 495899
33799 4 40 493 485 4982 423400
33822 4 426 4ZD 4ZD 4989 423400
我將能夠看到記錄以及關系明顯不同的地方。
嘗試groupby_transform
:
假設這個 dataframe
>>> df
A B C D E F
0 4 422 470 101 4100 410000
1 4 422 470 101 4100 410000
2 4 422 470 101 4100 410000
3 4 422 470 101 4100 410000
4 4 422 470 101 4100 410000
33831 4 426 4ZD 4ZD 4989 498999
33832 4 426 4ZD 4ZD 4989 498999
33833 4 426 4ZD 4ZD 4989 498999
33834 4 426 4ZD 4ZD 4989 498999
33835 4 426 4ZD 4ZE 4989 498999
# ^------ Parent problem
mask = df.groupby('E')['D'].transform(lambda x: len(x.unique()) != 1)
bad_df = df.loc[mask, ['D', 'E']]
print(bad_df)
# Output:
D E
33831 4ZD 4989
33832 4ZD 4989
33833 4ZD 4989
33834 4ZD 4989
33835 4ZE 4989
您仍然可以減少 dataframe:
>>> bad_df.drop_duplicates()
D E
33831 4ZD 4989
33835 4ZE 4989
# OR
>>> bad_df.groupby(['D', 'E']).apply(lambda x: x.index.tolist()) \
.rename('Index').reset_index()
D E Index
0 4ZD 4989 [33831, 33832, 33833, 33834]
1 4ZE 4989 [33835]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.