我有一个非常大的数据帧。当我运行时:use tempdb
go
--drop table subscriptions
--drop table users
go
CREATE TABLE users (
id int primary key,
locked bit,
name varchar(20)
);
CREATE TABLE subscriptions (
id int primary key,
name varchar(20),
id_user int references users
);
go
with N as
(
select row_number() over (order by (select null)) i
from sys.objects o, sys.columns c, sys.columns c2
)
insert into users (id,locked,name)
select top 10000 i, case when i%100 = 0 then 1 else 0 end, concat('user',i)
from N;
with N as
(
select row_number() over (order by (select null)) i
from sys.objects o, sys.columns c, sys.columns c2
)
insert into subscriptions(id,name,id_user)
select top 100000 i, case when i%100 = 0 then 'premium' else 'standard' end, i%10000 + 1
from N;
go
SELECT *
FROM users u
WHERE locked = 0
AND NOT EXISTS (SELECT *
FROM subscriptions
where id_user = u.id
and name = 'premium')
我收到以下错误:
df=df.drop_duplicates()
如果我运行ValueError: Buffer has wrong number of dimensions (expected 1, got 2)
它已经错误
有谁知道会导致什么?
修改
数据框如下所示:
df.loc[:10].drop_duplicates()
答案 0 :(得分:1)
如果不了解有关数据框架的更多信息,我将提供一些通用的想法: - pandas 0.18(https://github.com/pandas-dev/pandas/issues/13393)中存在一个已知错误,该错误导致包含datetime64数据类型的MultiIndexes发生缓冲区值错误。这是你的这类专栏之一吗? - 您的任何列都有重复的名称吗?我知道这不应该发生,但确实如此。 - 您是否需要在所有列中查找重复项,或者列的子集是否足够?尝试在方法调用中使用subset =选项。
Vico的答案可能会有所帮助,但是对于一个非常大的数据帧,对初始数据帧和具有丢弃重复项的数据帧进行转置可能比可以分配的资源更多。
答案 1 :(得分:1)
遇到此问题(并通过google结束此问题)的另一种方法是稀疏列...请参见以下错误:
n = 10000
df = pd.DataFrame({'a': np.random.choice(n*2, n),
'b': np.random.choice(10, n),
'c': np.random.choice(4, n),
'd': np.random.choice(int(n/2), n),
'e': np.random.choice(int(n/100), n)})
df_dummies = pd.get_dummies(df, columns=['b', 'c'], sparse=True)
df_dummies.drop_duplicates()
奇怪的是,df_dummies.to_dense()
无法解决您的问题-使用sparse=False
重新创建虚拟变量可以解决您的问题。
要检查重复的列(其他答案所建议的问题),可以使用以下代码段:
df.columns.duplicated()
答案 2 :(得分:0)
我面临着非常大的数据帧的相同问题,然后通过创建临时列来解决此问题,该临时列将一个字符串中的所有关键列连接在一起,然后根据该唯一添加的列删除重复项,然后在完成删除后暂时删除此临时列副本。
TeX