【问题标题】:Homogeneous splitting of pandas df [duplicate]pandas df的同构分裂[重复]
【发布时间】:2023-03-03 07:33:22
【问题描述】:
import pandas as pd
import numpy as np

df = pd.DataFrame({'ser_no': [1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0],
                'co_nm': ['aa', 'aa', 'aa', 'bb', 'bb', 'bb', 'bb', 'cc', 'cc', 'cc', 'aaa', 'aaa', 'aaa', 'bba', 'bba', 'bba', 'bba', 'cca', 'cca', 'cca'],
                'lat': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]})

df_splits = np.array_split(df, 4)

这就是我拆分数据框的方式。我希望拆分不会分散唯一的“co_nm”值,即说所有“co_nm”==“aa”的行都应该在一个拆分中。 'co_nm' 的所有值也是如此。

这可能吗?现有的方法似乎做不到。

【问题讨论】:

  • 我认为 OP 关闭它是一个骗子,因为社区是唯一关闭它的人。

标签: python pandas


【解决方案1】:

co_nm 更改的行上拆分:

df_splits = np.array_split(df, df.index[df["co_nm"].ne(df["co_nm"].shift())][1:])

>>> df_splits
[   ser_no co_nm  lat
 0       1    aa    1
 1       2    aa    2
 2       3    aa    3,
    ser_no co_nm  lat
 3       4    bb    4
 4       5    bb    5
 5       6    bb    6
 6       7    bb    7,
    ser_no co_nm  lat
 7       8    cc    8
 8       9    cc    9
 9       0    cc   10,
     ser_no co_nm  lat
 10       1   aaa    1
 11       2   aaa    2
 12       3   aaa    3,
     ser_no co_nm  lat
 13       4   bba    4
 14       5   bba    5
 15       6   bba    6
 16       7   bba    7,
     ser_no co_nm  lat
 17       8   cca    8
 18       9   cca    9
 19       0   cca   10]

【讨论】:

    【解决方案2】:

    尝试使用DataFrame.groupby,它将按指定列的唯一值对行进行分组:

    splits = [sub_df for _, sub_df in df.groupby('co_nm')]
    
    

    输出:

    >>> splits
    [   ser_no co_nm  lat
     0       1    aa    1
     1       2    aa    2
     2       3    aa    3,
         ser_no co_nm  lat
     10       1   aaa    1
     11       2   aaa    2
     12       3   aaa    3,
        ser_no co_nm  lat
     3       4    bb    4
     4       5    bb    5
     5       6    bb    6
     6       7    bb    7,
         ser_no co_nm  lat
     13       4   bba    4
     14       5   bba    5
     15       6   bba    6
     16       7   bba    7,
        ser_no co_nm  lat
     7       8    cc    8
     8       9    cc    9
     9       0    cc   10,
         ser_no co_nm  lat
     17       8   cca    8
     18       9   cca    9
     19       0   cca   10
    

    【讨论】:

    • 使用[df for _, df in df.groupby('co_nm')]
    【解决方案3】:

    您可以在co_nm 上使用groupby

    作为dict:

    d = {k: v for k,v in df.groupby('co_nm')}
    

    作为list:

    l = [v for _,v in df.groupby('co_nm')]
    

    输出:

    {'aa':    ser_no co_nm  lat
    0       1    aa    1
    1       2    aa    2
    2       3    aa    3, 
    
     'aaa':     ser_no co_nm  lat
    10       1   aaa    1
    11       2   aaa    2
    12       3   aaa    3, 
    
     'bb':    ser_no co_nm  lat
    3       4    bb    4
    4       5    bb    5
    5       6    bb    6
    6       7    bb    7, 
    
     'bba':     ser_no co_nm  lat
    13       4   bba    4
    14       5   bba    5
    15       6   bba    6
    16       7   bba    7, 
    
     'cc':    ser_no co_nm  lat
    7       8    cc    8
    8       9    cc    9
    9       0    cc   10, 
    
     'cca':     ser_no co_nm  lat
    17       8   cca    8
    18       9   cca    9
    19       0   cca   10}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 2021-02-11
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2021-03-01
      • 2021-11-11
      • 2021-07-16
      相关资源
      最近更新 更多