我是Python和Pandas的新手,我正在尝试将其用于对非常大的数据集(1000万个案例)进行统计分析,因为其他选项(SPSS和R)无法处理授权的数据集硬件
在这个分析中,我需要逐行搜索一系列列(确切地说是30个)以提取单个字符串(大约200个是可能的,不确定数据集中实际存在多少个)然后创建一个每个字符串的分类变量。
数据看起来像这样
Dx1 Dx2 Dx3 etc...
001 234 456
231 001 444
245 777 001
需要的是
Dx1 Dx2 Dx3 Var001 Var234 Var456 Var231 etc..
001 234 456 True True True False
231 001 444 True False False True
245 777 001 True False False False
关于如何做到这一点的任何想法?
df.dtypes显示
AGE int64
DISPUNIFORM int64
DRG int64
DRGVER int64
Readmit_30D int64
DXCCS1 int64
DXCCS2 int64
DXCCS3 int64
DXCCS4 int64
...on to DXCCS30
答案 0 :(得分:2)
我认为您希望将“一个热编码”数据集保留为稀疏矩阵。
请尝试以下内存保存方法:
from sklearn.feature_extraction.text import CountVectorizer
cv = CountVectorizer()
r = pd.SparseDataFrame(cv.fit_transform(df.astype(str).add(' ').sum(axis=1)),
columns=cv.get_feature_names(),
index=df.index,
default_fill_value=0).add_prefix('Var')
结果:
In [85]: r
Out[85]:
Var001 Var231 Var234 Var245 Var444 Var456 Var777
0 1 0 1 0 0 1 0
1 1 1 0 0 1 0 0
2 1 0 0 1 0 0 1
In [86]: r.memory_usage()
Out[86]:
Index 80
Var001 24
Var231 8
Var234 8
Var245 8
Var444 8
Var456 8
Var777 8
dtype: int64
说明:
我使用以下技巧将所有数据收集到一列中:
In [89]: df.astype(str).add(' ').sum(axis=1)
Out[89]:
0 001 234 456
1 231 001 444
2 245 777 001
dtype: object
PS不会将源DF的稀疏DF加入,因为它可能会导致“爆炸”回到正常(非稀疏)DF:
In [87]: df.join(r)
Out[87]:
Dx1 Dx2 Dx3 Var001 Var231 Var234 Var245 Var444 Var456 Var777
0 001 234 456 1 0 1 0 0 1 0
1 231 001 444 1 1 0 0 1 0 0
2 245 777 001 1 0 0 1 0 0 1
In [88]: df.join(r).memory_usage()
Out[88]:
Index 80
Dx1 24
Dx2 24
Dx3 24
Var001 24
Var231 24
Var234 24
Var245 24
Var444 24
Var456 24
Var777 24
dtype: int64
答案 1 :(得分:1)
将get_dummies
与max
一起使用,转换为bool
,将join
转换为原始版本:
df = (df.join(pd.get_dummies(df, prefix_sep='', prefix='')
.max(level=0, axis=1)
.astype(bool)
.add_prefix('Var')))
print (df)
Dx1 Dx2 Dx3 Var001 Var231 Var245 Var234 Var777 Var444 Var456
0 001 234 456 True False False True False False True
1 231 001 444 True True False False False True False
2 245 777 001 True False True False True False False