Как будто вы пытаетесь получить доступ к объекту, который является null
. Рассмотрим ниже пример:
TypeA objA;
. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException
, что имеет смысл.
См. Также этот пример:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
Во-первых, ваш подход неэффективен, потому что добавление в список по строке будет медленным, так как оно должно периодически увеличивать список, когда для новой записи недостаточно места, в этом смысле лучше понимать списки, так как размер определяется заранее и выделяется один раз.
Однако, я думаю, что в принципе ваш подход немного расточительный, поскольку у вас уже есть 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'
splitted_df = [v for k, v in df.groupby('name')]
Groupby может вам помочь:
grouped = data.groupby(['name'])
Затем вы можете работать с каждой группой, например с кадром данных для каждого участника. Объектные методы 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
в 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
В дополнение к ответу Гусева Славы, вы можете захотеть использовать группы groupby:
{key: df.loc[value] for key, value in df.groupby("name").groups.items()}
Это даст словарь с ключами, которые вы сгруппировали, указав на соответствующие разделы. Преимущество заключается в том, что ключи сохраняются и не исчезают в индексе списка.
{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']
Надейтесь, что помогает
data[:][data.Names == key]
- особенно использование двоеточия в скобках после data
– vagabond
22 October 2016 в 22:03
data[:][data.Names == key]
эквивалентно data.loc[:, data.Names == key]
, то есть просто индексирует все строки в столбце data.Names == key
. Двоеточие можно использовать для записи data[0:10]
, который будет первым десяти строк. Только размещение двоеточия означает, что все строки должны индексироваться.
– Woody Pride
24 October 2016 в 14:10
.loc
synthax {indexingError}Unalignable boolean Series key provided
, опуская двоеточие или записывая его как data.loc[:][data.Names == key]
, дал желаемый результат для индекса всех строк
– Jad S
24 April 2017 в 18:42
to_list
работал над объектамиPandas
, аtolist
был методом на np-массивах, похоже, что они сделали апи синтаксически одинаковым сейчас, обновили мой ответ отразить это – EdChum 8 December 2015 в 10:01loc
, а затем вы фильтруете его дальше или используетеset_value
для обновления этого представления, оно должно вызывать предупреждение, если вы это сделаете, лучше всего используйтеloc
с полным фильтром и установите столбец одновременно, чтобы избежать этого, например в вашем случаеview = df.loc[(df.name==j) & df['col'].isin(values), 'col'] = -1
или аналогичных – EdChum 9 November 2016 в 20:52