Как использовать переменную в имени фрейма данных и использовать for-loop для создания нескольких фреймов данных в python [duplicate]

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
46
задан Martin Petri Bagger 5 November 2013 в 16:01
поделиться

8 ответов

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

Однако, я думаю, что в принципе ваш подход немного расточительный, поскольку у вас уже есть 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'
31
ответ дан EdChum 18 August 2018 в 02:39
поделиться
  • 1
    Я думаю, это должно быть tolist () вместо to_list (). – Shivam Agrawal 8 December 2015 в 09:30
  • 2
    @ShivamAgrawal Я думаю, что это последнее дело, в прошлом to_list работал над объектами Pandas, а tolist был методом на np-массивах, похоже, что они сделали апи синтаксически одинаковым сейчас, обновили мой ответ отразить это – EdChum 8 December 2015 в 10:01
  • 3
    Спасибо @EdChum. – Shivam Agrawal 8 December 2015 в 11:45
  • 4
    @EdChum, используя это представление, невозможно изменить, например, значение определенного столбца. Любые советы о том, как? – Georges 9 November 2016 в 03:00
  • 5
    @GeorgesHb, которые отличаются от правил, немного нечеткие, когда вы берете начальное представление с помощью loc, а затем вы фильтруете его дальше или используете set_value для обновления этого представления, оно должно вызывать предупреждение, если вы это сделаете, лучше всего используйте loc с полным фильтром и установите столбец одновременно, чтобы избежать этого, например в вашем случае view = df.loc[(df.name==j) & df['col'].isin(values), 'col'] = -1 или аналогичных – EdChum 9 November 2016 в 20:52
splitted_df = [v for k, v in df.groupby('name')]
0
ответ дан Daniel Braun 18 August 2018 в 02:39
поделиться

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

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

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

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

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

9
ответ дан Gusev Slava 18 August 2018 в 02:39
поделиться
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
4
ответ дан Jeff 18 August 2018 в 02:39
поделиться

Вы можете преобразовать объект 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  A  B  C
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  A  B  C
2    b  4  9  5
3    b  5  4  7, 'e':   Name  A  B  C
4    e  5  2  1, 'a':   Name  A  B  C
0    a  4  7  1
1    a  5  8  3, 'f':   Name  A  B  C
5    f  4  3  0}

print (d['a'])
  Name  A  B  C
0    a  4  7  1
1    a  5  8  3
17
ответ дан jezrael 18 August 2018 в 02:39
поделиться

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

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

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

3
ответ дан Quickbeam2k1 18 August 2018 в 02:39
поделиться
  • 1
    благодаря! это заняло менее половины времени по сравнению с нарезкой. Я смог получить условие, чтобы исключить df, которые были ниже определенной длины. код: {str(key): df.loc[value] for key, value in df.groupby("tripid").groups.items() if len(value) >= threshold_triplen } – nikhilvj 11 June 2018 в 14:46

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

#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']

Надейтесь, что помогает

39
ответ дан Woody Pride 18 August 2018 в 02:39
поделиться
  • 1
    Ой, я пропустил бит о желании этого в списке, мое решение использует словарь ... Я думаю, что, возможно, я пропустил суть вопроса – Woody Pride 5 November 2013 в 16:30
  • 2
    Более Pythonic, чем принятый ответ. – Jubbles 1 January 2015 в 00:29
  • 3
    @WoodyPride приятный ответ спасибо. Я просто перехожу из R в Python - не могли бы вы объяснить последний шаг в своем ответе с комментариями? Я понял, что dict, созданный на предыдущем шаге, не сортирует строки в правый ключ. Эта часть меня путает data[:][data.Names == key] - особенно использование двоеточия в скобках после data – vagabond 22 October 2016 в 22:03
  • 4
    data[:][data.Names == key] эквивалентно data.loc[:, data.Names == key], то есть просто индексирует все строки в столбце data.Names == key. Двоеточие можно использовать для записи data[0:10], который будет первым десяти строк. Только размещение двоеточия означает, что все строки должны индексироваться. – Woody Pride 24 October 2016 в 14:10
  • 5
    запись двоеточия металась в .loc synthax {indexingError}Unalignable boolean Series key provided, опуская двоеточие или записывая его как data.loc[:][data.Names == key], дал желаемый результат для индекса всех строк – Jad S 24 April 2017 в 18:42
0
ответ дан Brian Tompsett - 汤莱恩 6 September 2018 в 17:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: