Как отбросить определенные строки в DataFrame для создания вложенного JSON - PullRequest
0 голосов
/ 21 мая 2019

В настоящее время я работаю с древовидной картой d3, для которой в качестве записи требуется вложенный json, мне удалось организовать df и сгенерировать json, но некоторые прямоугольники древовидной карты в 30 раз больше других, поэтому я решил отбросить строки, которые генерируютэтот прямоугольник.

Моя функция dropSmall() выполняет итерацию в моих столбцах и моих строках, чтобы проверить для каждой группы, является ли сумма в 30 раз меньше максимальной суммы, с которой я борюсь при обновлении df, используя падение или влияя назначение, которое соответствует Вот мой код:

def dropSmall(df):
    list = []
    for i in df.columns: #b, c, z ..
        if i != 'valeur' and i!='unite':
            list.append(i)
            # iterating on rows
            for j in range(df.groupby(list).sum().shape[0]): 
                myMax = df.groupby(list).sum().iloc[:, 0].max() / 30
                myJ = df.groupby(list).sum().iloc[:, 0][j]
                myDf = df.groupby(list).sum().iloc[:, 0]
                if myJ <= myMax:
                    df = df[myDf['value']>=  myMax]

и мой групповой вид выглядит следующим образом


          name          b   c   z   l   sL  value       unit
3099    Myindicator     1   1   3   NA  NA  129.74      kg
3100                                    1   44929.74    kg
3101                                    2   5174.74     kg
3110                    3   1   3   1   NA  2497.66     kg
3156                                2   NA  29.43       kg
3222                                3   NA  304.81      kg


Для примера первого ряда, когда b = 1 c = 1 z = 3 l= NA Я хочу проверить при итерации 3 sL, что значение sL> 30x от максимальной этой суммы, и для этого случая отбросить строку, когда значение = 129

Моя функция проверяет условие, но яне знаю, как убрать строку из моего начального df not df.groupby('list').sum()

Пример несгруппированного df для первой строки

        name        Continent  Region   Country   State   City    Borough  Value       Unit
1000    Myindicator     1        1        3        1      1         1      53.86      kg

[EDIT FROM HERE]

Моя отсечкамножитель здесь равен 2 Существует максимум для каждой иерархии

                                            Value
name        Continent Region Country State       
Myindicator 1         1      1       7         50[MAX]
                                     8         30 
                             2       5         70[MAX]
                                     6         30 *
                             3       1         50[MAX]
                             4       5        200[MAX]
                                     6        150 
                             5       1        300[MAX]
                                     6        160
                                     7        100*
                                     8         50*
                                     9         50*
                      2      4       9        100[MAX]
                                     10        40 *
                             5       3         80[MAX]
                                     11        20 *
                             6       2         10[MAX]
                      3      7       12       100[MAX]


В этом примере вы не отбросите регион 2, страну 6, штат 2, потому что это единственная строка для этого региона> страна> штат и она находится нав то же время макс

Надеюсь, это яснее

1 Ответ

0 голосов
/ 21 мая 2019

Так что я не на 100% уверен в том, как выглядит ваш ввод или что вы хотите вернуть, но если я правильно понимаю, я думаю, что сработает следующее.

ИЗД.

EDIT2 : добавлены звездочки (*), чтобы указать, какие строки отбрасываются.

EDIT3 : изменена функция из-за назначения путии копии работают с pandas.DataFrame

Функция для выполнения процесса:

def drop_small(dfcop, cutoff_multiplier):
    # Create copy of dataframe so we don't alter the original
    df=dfcop.copy(deep=True)
    # Group on all columns except 'Value' and 'Unit'
    grp_cols = [i for i in df.columns if i not in ['Value', 'Unit']]
    groupers = [grp_cols[:i+1] for i in range(len(grp_cols))]
    print(groupers)
    #loop through all hierarchical groupings
    for grp in groupers:
        print(f"Grouping on {grp}")
        # Add a column with the group sums to the dataframe
        df['gsum'] = df.groupby(grp)['Value'].transform('sum')
        # Compute the max of the parent group - don't do this if we are grouping by a single field
        if len(grp) > 1:
            df['gmax'] = df.groupby(grp[:-1])['gsum'].transform(lambda x: max(x)/cutoff_multiplier)
        else:
            df['gmax'] = df.gsum.max()/cutoff_multiplier
        print("Grouped sums and cutoffs for this hierarchy:")
        print(df)
        # Drop all rows where the group sum is less than the cutoff mulitplier of the max
        idexs = df[df.gsum < df.gmax].index
        df = df[df.gsum >= df.gmax]
        print('Indexes dropped:')
        print(','.join([str(i) for i in idexs]))
        # Remove the group sum column
        df.drop(['gsum', 'gmax'], axis=1, inplace=True)
    return df

Вот как это работает для примера таблицы.

           name  Continent  Region  Country  State  Value Unit
0   Myindicator          1       1        3      1     50   kg
1   Myindicator          1       1        3      4     50   kg
2   Myindicator          1       1        2      5     20   kg
3   Myindicator          1       1        2      5     50   kg
4   Myindicator          1       1        2      6     30   kg
5   Myindicator          1       1        1      7     50   kg
6   Myindicator          1       1        1      8     20   kg
7   Myindicator          1       2        4      9     50   kg
8   Myindicator          1       2        4      9     50   kg
9   Myindicator          1       2        4     10     40   kg
10  Myindicator          1       2        5     11     20   kg
11  Myindicator          1       2        5      3     40   kg
12  Myindicator          1       2        5      3     40   kg
13  Myindicator          1       2        6      2     10   kg
14  Myindicator          1       3        7     12     50   kg
15  Myindicator          1       3        7     12     50   kg
16  Myindicator          1       3        8     14     15   kg
17  Myindicator          1       3        8     14     15   kg
18  Myindicator          1       3        8     13     15   kg
19  Myindicator          1       3        8     13      1   kg
20  Myindicator          1       4        9     15     10   kg
21  Myindicator          1       4        9     16     10   kg

Группировка по ['name'] Сгруппированные суммы и обрезки для этой иерархии:

           name  Continent  Region  Country  State  Value Unit  gsum  gmax
0   Myindicator          1       1        3      1     50   kg   686   343
1   Myindicator          1       1        3      4     50   kg   686   343
2   Myindicator          1       1        2      5     20   kg   686   343
3   Myindicator          1       1        2      5     50   kg   686   343
4   Myindicator          1       1        2      6     30   kg   686   343
5   Myindicator          1       1        1      7     50   kg   686   343
6   Myindicator          1       1        1      8     20   kg   686   343
7   Myindicator          1       2        4      9     50   kg   686   343
8   Myindicator          1       2        4      9     50   kg   686   343
9   Myindicator          1       2        4     10     40   kg   686   343
10  Myindicator          1       2        5     11     20   kg   686   343
11  Myindicator          1       2        5      3     40   kg   686   343
12  Myindicator          1       2        5      3     40   kg   686   343
13  Myindicator          1       2        6      2     10   kg   686   343
14  Myindicator          1       3        7     12     50   kg   686   343
15  Myindicator          1       3        7     12     50   kg   686   343
16  Myindicator          1       3        8     14     15   kg   686   343
17  Myindicator          1       3        8     14     15   kg   686   343
18  Myindicator          1       3        8     13     15   kg   686   343
19  Myindicator          1       3        8     13      1   kg   686   343
20  Myindicator          1       4        9     15     10   kg   686   343
21  Myindicator          1       4        9     16     10   kg   686   343

Пропущено индексов: нет

Группировка по ['name', 'Continent'] Сгруппированные суммы и обрезки для этой иерархии:

           name  Continent  Region  Country  State  Value Unit  gsum  gmax
0   Myindicator          1       1        3      1     50   kg   686   343
1   Myindicator          1       1        3      4     50   kg   686   343
2   Myindicator          1       1        2      5     20   kg   686   343
3   Myindicator          1       1        2      5     50   kg   686   343
4   Myindicator          1       1        2      6     30   kg   686   343
5   Myindicator          1       1        1      7     50   kg   686   343
6   Myindicator          1       1        1      8     20   kg   686   343
7   Myindicator          1       2        4      9     50   kg   686   343
8   Myindicator          1       2        4      9     50   kg   686   343
9   Myindicator          1       2        4     10     40   kg   686   343
10  Myindicator          1       2        5     11     20   kg   686   343
11  Myindicator          1       2        5      3     40   kg   686   343
12  Myindicator          1       2        5      3     40   kg   686   343
13  Myindicator          1       2        6      2     10   kg   686   343
14  Myindicator          1       3        7     12     50   kg   686   343
15  Myindicator          1       3        7     12     50   kg   686   343
16  Myindicator          1       3        8     14     15   kg   686   343
17  Myindicator          1       3        8     14     15   kg   686   343
18  Myindicator          1       3        8     13     15   kg   686   343
19  Myindicator          1       3        8     13      1   kg   686   343
20  Myindicator          1       4        9     15     10   kg   686   343
21  Myindicator          1       4        9     16     10   kg   686   343

Индексы отброшены: нет

Группировка по ['name', 'Continent', 'Region'] Сгруппированные суммы и сокращения для этой иерархии:

           name  Continent  Region  Country  State  Value Unit  gsum  gmax
0   Myindicator          1       1        3      1     50   kg   270   135
1   Myindicator          1       1        3      4     50   kg   270   135
2   Myindicator          1       1        2      5     20   kg   270   135
3   Myindicator          1       1        2      5     50   kg   270   135
4   Myindicator          1       1        2      6     30   kg   270   135
5   Myindicator          1       1        1      7     50   kg   270   135
6   Myindicator          1       1        1      8     20   kg   270   135
7   Myindicator          1       2        4      9     50   kg   250   135
8   Myindicator          1       2        4      9     50   kg   250   135
9   Myindicator          1       2        4     10     40   kg   250   135
10  Myindicator          1       2        5     11     20   kg   250   135
11  Myindicator          1       2        5      3     40   kg   250   135
12  Myindicator          1       2        5      3     40   kg   250   135
13  Myindicator          1       2        6      2     10   kg   250   135
14  Myindicator          1       3        7     12     50   kg   146   135
15  Myindicator          1       3        7     12     50   kg   146   135
16  Myindicator          1       3        8     14     15   kg   146   135
17  Myindicator          1       3        8     14     15   kg   146   135
18  Myindicator          1       3        8     13     15   kg   146   135
19  Myindicator          1       3        8     13      1   kg   146   135
20  Myindicator          1       4        9     15     10   kg    20   135 *
21  Myindicator          1       4        9     16     10   kg    20   135 *

Индексы отброшены: 20,21

Группировка по ['name', 'Continent', 'Region', 'Country']Сгруппированные суммы и сокращения для этой иерархии:

           name  Continent  Region  Country  State  Value Unit  gsum  gmax
0   Myindicator          1       1        3      1     50   kg   100    50
1   Myindicator          1       1        3      4     50   kg   100    50
2   Myindicator          1       1        2      5     20   kg   100    50
3   Myindicator          1       1        2      5     50   kg   100    50
4   Myindicator          1       1        2      6     30   kg   100    50
5   Myindicator          1       1        1      7     50   kg    70    50
6   Myindicator          1       1        1      8     20   kg    70    50
7   Myindicator          1       2        4      9     50   kg   140    70
8   Myindicator          1       2        4      9     50   kg   140    70
9   Myindicator          1       2        4     10     40   kg   140    70
10  Myindicator          1       2        5     11     20   kg   100    70
11  Myindicator          1       2        5      3     40   kg   100    70
12  Myindicator          1       2        5      3     40   kg   100    70
13  Myindicator          1       2        6      2     10   kg    10    70 *
14  Myindicator          1       3        7     12     50   kg   100    50
15  Myindicator          1       3        7     12     50   kg   100    50
16  Myindicator          1       3        8     14     15   kg    46    50 *
17  Myindicator          1       3        8     14     15   kg    46    50 *
18  Myindicator          1       3        8     13     15   kg    46    50 *
19  Myindicator          1       3        8     13      1   kg    46    50 *

Пропущено индексов: 13,16,17,18,19

Группировка по['name', 'Continent', 'Region', 'Country', 'State'] Сгруппированные суммы и сокращения для этой иерархии:

           name  Continent  Region  Country  State  Value Unit  gsum  gmax
0   Myindicator          1       1        3      1     50   kg    50    25
1   Myindicator          1       1        3      4     50   kg    50    25
2   Myindicator          1       1        2      5     20   kg    70    35
3   Myindicator          1       1        2      5     50   kg    70    35
4   Myindicator          1       1        2      6     30   kg    30    35 *
5   Myindicator          1       1        1      7     50   kg    50    25
6   Myindicator          1       1        1      8     20   kg    20    25 *
7   Myindicator          1       2        4      9     50   kg   100    50
8   Myindicator          1       2        4      9     50   kg   100    50
9   Myindicator          1       2        4     10     40   kg    40    50 *
10  Myindicator          1       2        5     11     20   kg    20    40 *
11  Myindicator          1       2        5      3     40   kg    80    40
12  Myindicator          1       2        5      3     40   kg    80    40
14  Myindicator          1       3        7     12     50   kg   100    50
15  Myindicator          1       3        7     12     50   kg   100    50

Пропущено индексов: 4,6,9,10

Финальный стол:

           name  Continent  Region  Country  State  Value Unit
0   Myindicator          1       1        3      1     50   kg
1   Myindicator          1       1        3      4     50   kg
2   Myindicator          1       1        2      5     20   kg
3   Myindicator          1       1        2      5     50   kg
5   Myindicator          1       1        1      7     50   kg
7   Myindicator          1       2        4      9     50   kg
8   Myindicator          1       2        4      9     50   kg
11  Myindicator          1       2        5      3     40   kg
12  Myindicator          1       2        5      3     40   kg
14  Myindicator          1       3        7     12     50   kg
15  Myindicator          1       3        7     12     50   kg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...