簡體   English   中英

Python,Pandas; 按列中最常見的值對 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM