Разделение кадра данных на несколько фреймов данных

У меня очень большой фреймворк (около 1 миллиона строк) с данными из эксперимента (60 респондентов). Я хотел бы разделить фрейм данных на 60 фреймов данных (кадр данных для каждого участника).

В dataframe (называется = data) есть переменная с именем 'name', которая является уникальным кодом для каждого участника.

Я пробовал следующее, но ничего не происходит (или не останавливается в течение часа). То, что я намереваюсь сделать, – разделить данные (данные) на более мелкие фреймы данных и добавить их в список (datalist):

import pandas as pd def splitframe(data, name='name'): n = data[name][0] df = pd.DataFrame(columns=data.columns) datalist = [] for i in range(len(data)): if data[name][i] == n: df = df.append(data.iloc[i]) else: datalist.append(df) df = pd.DataFrame(columns=data.columns) n = data[name][i] df = df.append(data.iloc[i]) return datalist 

Я не получаю сообщение об ошибке, скрипт, похоже, работает вечно!

Есть ли разумный способ сделать это?

  • Ошибка атрибута: объект «list» не имеет атрибута «split»
  • Pandas Dataframe: разделение столбца на несколько столбцов, выравнивание по правому краю элементов ячейки
  • Как разбить XML-файл на Python?
  • tokenize строку, содержащую разделители в Python
  • Как разделить изображение на несколько частей в Python
  • Почему расщепление строки медленнее на C ++, чем на Python?
  • Разделение строки, разделенной точкой с запятой, на словарь, в Python
  • Почему это регулярное выражение приводит к четырем элементам?
  • 6 Solutions collect form web for “Разделение кадра данных на несколько фреймов данных”

    Во-первых, ваш подход неэффективен, потому что добавление к списку по строке будет медленным, так как оно должно периодически увеличивать список, когда для новой записи недостаточно места, в этом смысле лучше понимать списки, поскольку размер определяется вверх спереди и выделено один раз.

    Тем не менее, я думаю, что в принципе ваш подход немного расточительный, поскольку у вас уже есть dataframe, поэтому зачем создавать новый для каждого из этих пользователей?

    Я бы сортировал dataframe по столбцу 'name' , устанавливал индекс таким образом и, если необходимо, не удалял столбец.

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

    Так:

     # sort the dataframe df.sort(columns=['name'], inplace=True) # set the index to be this and don't drop df.set_index(keys=['name'], drop=False,inplace=True) # get a list of names names=df['name'].unique().tolist() # now we can perform a lookup on a 'view' of the dataframe joe = df.loc[df.name=='joe'] # now you can query all 'joes' 

    Могу ли я спросить, почему бы просто не сделать это, отрезав фрейм данных. Что-то вроде

     #create some data with Names column data = pd.DataFrame({'Names': ['Joe', 'John', 'Jasper', 'Jez'] *4, 'Ob1' : np.random.rand(16), 'Ob2' : np.random.rand(16)}) #create unique list of names UniqueNames = data.Names.unique() #create a data frame dictionary to store your data frames DataFrameDict = {elem : pd.DataFrame for elem in UniqueNames} for key in DataFrameDict.keys(): DataFrameDict[key] = data[:][data.Names == key] 

    Привет, у вас есть словарь данных, так же, как (я думаю), вы хотите их. Нужно получить доступ к одному? Просто введите

     DataFrameDict['Joe'] 

    надеюсь, это поможет

    Groupby может помочь вам:

    grouped = data.groupby(['name'])

    Затем вы можете работать с каждой группой, как с помощью dataframe для каждого участника. Объектные методы DataFrameGroupBy, такие как (apply, transform, aggregate, head, first, last), возвращают объект DataFrame.

    Или вы можете составить список из grouped и получить все данные DataFrame по индексу:

    l_grouped = list(grouped) l_grouped[0][1] – DataFrame для первой группы с именем.

     In [28]: df = DataFrame(np.random.randn(1000000,10)) In [29]: df Out[29]: <class 'pandas.core.frame.DataFrame'> Int64Index: 1000000 entries, 0 to 999999 Data columns (total 10 columns): 0 1000000 non-null values 1 1000000 non-null values 2 1000000 non-null values 3 1000000 non-null values 4 1000000 non-null values 5 1000000 non-null values 6 1000000 non-null values 7 1000000 non-null values 8 1000000 non-null values 9 1000000 non-null values dtypes: float64(10) In [30]: frames = [ df.iloc[i*60:min((i+1)*60,len(df))] for i in xrange(int(len(df)/60.) + 1) ] In [31]: %timeit [ df.iloc[i*60:min((i+1)*60,len(df))] for i in xrange(int(len(df)/60.) + 1) ] 1 loops, best of 3: 849 ms per loop In [32]: len(frames) Out[32]: 16667 

    Вот групповой способ (и вы можете сделать произвольное применение, а не сумму)

     In [9]: g = df.groupby(lambda x: x/60) In [8]: g.sum() Out[8]: <class 'pandas.core.frame.DataFrame'> Int64Index: 16667 entries, 0 to 16666 Data columns (total 10 columns): 0 16667 non-null values 1 16667 non-null values 2 16667 non-null values 3 16667 non-null values 4 16667 non-null values 5 16667 non-null values 6 16667 non-null values 7 16667 non-null values 8 16667 non-null values 9 16667 non-null values dtypes: float64(10) 

    Сумма cythonized, поэтому это так быстро

     In [10]: %timeit g.sum() 10 loops, best of 3: 27.5 ms per loop In [11]: %timeit df.groupby(lambda x: x/60) 1 loops, best of 3: 231 ms per loop 

    В дополнение к ответу Гусева Славы, вы можете захотеть использовать группы groupby:

     {key: df.loc[value] for key, value in df.groupby("name").groups.items()} 

    Это даст словарь с ключами, которые вы сгруппировали, указав на соответствующие разделы. Преимущество заключается в том, что ключи сохраняются и не исчезают в индексе списка.

    Вы можете преобразовать объект groupby в tuples а затем в dict :

     df = pd.DataFrame({'Name':list('aabbef'), 'A':[4,5,4,5,5,4], 'B':[7,8,9,4,2,3], 'C':[1,3,5,7,1,0]}, columns = ['Name','A','B','C']) print (df) Name ABC 0 a 4 7 1 1 a 5 8 3 2 b 4 9 5 3 b 5 4 7 4 e 5 2 1 5 f 4 3 0 d = dict(tuple(df.groupby('Name'))) print (d) {'b': Name ABC 2 b 4 9 5 3 b 5 4 7, 'e': Name ABC 4 e 5 2 1, 'a': Name ABC 0 a 4 7 1 1 a 5 8 3, 'f': Name ABC 5 f 4 3 0} print (d['a']) Name ABC 0 a 4 7 1 1 a 5 8 3 
    Python - лучший язык программирования в мире.