Python 从所有列获取唯一值的高效且优雅的方法-大数据

Python 从所有列获取唯一值的高效且优雅的方法-大数据,python,python-3.x,pandas,dataframe,unique,Python,Python 3.x,Pandas,Dataframe,Unique,我有一个超过600列的数据框。我在这里给出了一个数据框架示例,其中没有几列 df_new = pd.DataFrame({'person_id' :[1,2,3],'obs_date':['12/31/2007','11/25/2009',np.nan], 'hero_id':[2,4,np.nan],'date2':['12/31/2017',np.nan,'10/06/2015'], 'heroine_id':[1,np.nan,5],'date3':['12/31/2027',

我有一个超过600列的数据框。我在这里给出了一个数据框架示例,其中没有几列

df_new = pd.DataFrame({'person_id' :[1,2,3],'obs_date':['12/31/2007','11/25/2009',np.nan],
   'hero_id':[2,4,np.nan],'date2':['12/31/2017',np.nan,'10/06/2015'],
   'heroine_id':[1,np.nan,5],'date3':['12/31/2027','11/25/2029',np.nan],
   'bud_source_value':[1250000,250000,np.nan],
   'prod__source_value':[10000,20000,np.nan]})
我想从每个列中获取唯一的值,并将其输出到另一个数据帧中

这是我尝试过的两种方法

cols = df_new.columns.tolist()
unique_list = dict()
for c in cols:  #appraoch 1
    unique_list[c] = df_new[c].unique()

有没有一次就可以做到这一点?请注意,我希望数据框中的每一列都有唯一的值,而不是唯一的行


由于我的数据超过百万条记录,列数超过600个,任何改进建议/解决方案都会很有帮助

将dataframe转换为numpy数组并执行以下操作

df_new =  np.array(df_new)
unique_list = np.unique(df_new,axis=1)
Numpy快多了

您可以尝试:

print({k:v.drop_duplicates().tolist() for k,v in df_new.items()})
输出:

{'bud_source_value': [1250000.0, 250000.0, nan], 'date2': ['12/31/2017', nan, '10/06/2015'], 'date3': ['12/31/2027', '11/25/2029', nan], 'hero_id': [2.0, 4.0, nan], 'heroine_id': [1.0, nan, 5.0], 'obs_date': ['12/31/2007', '11/25/2009', nan], 'person_id': [1, 2, 3], 'prod__source_value': [10000.0, 20000.0, nan]}

Numpy很快,但pandas也很快,因为pandas依赖于Numpy,这就是为什么
pd.Series.unique
给出了一个Numpy数组,但它给出了一个错误
TypeError:dtype对象不支持unique的axis参数(“它给出了数据帧中的所有唯一值,但不是按列。缺少列名
df\u new.items()
将df转换为dict?仅此而已吗?”?
{'bud_source_value': [1250000.0, 250000.0, nan], 'date2': ['12/31/2017', nan, '10/06/2015'], 'date3': ['12/31/2027', '11/25/2029', nan], 'hero_id': [2.0, 4.0, nan], 'heroine_id': [1.0, nan, 5.0], 'obs_date': ['12/31/2007', '11/25/2009', nan], 'person_id': [1, 2, 3], 'prod__source_value': [10000.0, 20000.0, nan]}