Разделение кадра данных панд на основе значения

1

Я хотел бы разделить рамку данных панд на группы, чтобы обрабатывать каждую группу отдельно. Мой файл value.csv содержит следующие номера

num tID y x height width
2   0   0   0   1   16
2   1   1   0   1   16 
5   0   1   0   1   16 
5   1   0   0   1   8 
5   2   0   8   1   8 
6   0   0   0   1   16 
6   1   1   0   1   8 
6   2   1   8   1   8
2   0   0   0   1   16
2   1   1   0   1   16 
5   0   1   0   1   16 
5   1   0   0   1   8 
5   2   0   8   1   8 
6   0   0   0   1   16 
6   1   1   0   1   8 
6   2   1   8   1   8

Я хотел бы разбить данные на основе начального значения 0 в столбце tID как и для первого 4-го разделения.

Первый:

2   0   0   0   1   16
2   1   1   0   1   16 

Во-вторых:

5   0   1   0   1   16 
5   1   0   0   1   8 
5   2   0   8   1   8 

В третьих:

6   0   0   0   1   16 
6   1   1   0   1   8 
6   2   1   8   1   8

В-четвертых:

2   0   0   0   1   16
2   1   1   0   1   16 

Для этого я попытался разделить его, используя, если не успех, какие-либо эффективные идеи?

    import pandas as pd
    statQuality = 'value.csv'
    df = pd.read_csv(statQuality, names=['num','tID','y','x','height','width'])


    df2 = df.copy()
    df2.drop(['num'], axis=1, inplace=True)

    x = []

    for index, row in df2.iterrows():
        if row['tID'] == 0:
            x = []
            x.append(row)
            print(x)
        else:
            x.append(row)
  • 0
    Я предлагаю использовать d = dict(tuple(df.groupby('num')))
  • 0
    @jezrael Спасибо, хорошая идея, но другой файл .csv может содержать повторяющиеся значения для num. Так что это не хороший селектор.
Показать ещё 9 комментариев
Теги:
pandas

1 ответ

1
Лучший ответ

Использование:

#create groups by consecutive values
s = df['num'].ne(df['num'].shift()).cumsum()
#create helper count Series for duplicated groups like '2_0', '2_1'...
g = s.groupby(df['num']).transform(lambda x: x.factorize()[0])
#dictionary of DataFrames
d = {'{}_{}'.format(i,j): v.drop('num', axis=1) for (i, j), v in df.groupby(['num', g])}
print (d)
{'2_0':    tID  y  x  height  width
0    0  0  0       1     16
1    1  1  0       1     16, '2_1':    tID  y  x  height  width
8    0  0  0       1     16
9    1  1  0       1     16, '5_0':    tID  y  x  height  width
2    0  1  0       1     16
3    1  0  0       1      8
4    2  0  8       1      8, '5_1':     tID  y  x  height  width
10    0  1  0       1     16
11    1  0  0       1      8
12    2  0  8       1      8, '6_0':    tID  y  x  height  width
5    0  0  0       1     16
6    1  1  0       1      8
7    2  1  8       1      8, '6_1':     tID  y  x  height  width
13    0  0  0       1     16
14    1  1  0       1      8
15    2  1  8       1      8}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню