Python-在多个列中搜索字符串以设置分类变量值
我对Python和Pandas非常陌生,我正试图使用它对一个非常大的数据集(1000万个案例)进行统计分析,因为其他选项(SPSS和R)无法在授权硬件上处理数据集 在这个分析中,我需要按行搜索一系列列(准确地说是30列)以提取单个字符串(可能有大约200个,不确定数据集中实际存在多少个),然后为每个字符串创建一个分类变量 数据如下所示Python-在多个列中搜索字符串以设置分类变量值,python,pandas,Python,Pandas,我对Python和Pandas非常陌生,我正试图使用它对一个非常大的数据集(1000万个案例)进行统计分析,因为其他选项(SPSS和R)无法在授权硬件上处理数据集 在这个分析中,我需要按行搜索一系列列(准确地说是30列)以提取单个字符串(可能有大约200个,不确定数据集中实际存在多少个),然后为每个字符串创建一个分类变量 数据如下所示 Dx1 Dx2 Dx3 etc... 001 234 456 231 001 444 24
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
与max
一起使用,转换为bool
,最后转换为原始版本:
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
我认为您希望将“一个热编码”数据集保持为稀疏矩阵
因此,请尝试以下节省内存的方法:
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:
我认为这不符合OPs的记忆…:(@jezrael我无法理解“.max(level=0,axis=1)”,为什么添加level=0将合并具有相同列名的列,而不添加level=0将计算每行的最大元素而不区分列名?此外,“pd.get_dummies(df,前缀_sep=”,前缀=“”)获取数据帧的索引是“RangeIndex(start=0,stop=3,step=1)”类型,它不被视为多索引结构?如果方便的话,谢谢您的回答。@AYI-如果只使用
pd.get\u假人(df,prefix\u sep='',prefix='')
则会创建重复的列名。因此添加了.max(level=0,axis=1)
对于按列分组和获取最大值,不使用sum,因为如果相同列中的值1返回2,则指标列应仅包含0
或1
。因此,如果double1
它返回的最大值为1
@AyiF-它是df=df.groupby(level=0,axis=1)的shorcuts()
类似于df=df.max(level=0,axis=1)
@jezrael这是我第一次通过同时使用关键字参数“level and axis”来接触groups。我键入代码是为了初步理解。感谢您的回答。这是值得学习的。在为SparFrame运行代码时,返回“TypeError:无法将['']与块值进行比较”。@Rorbinson,你能发布df.dtypes
的输出吗?添加到问题正文中的数据类型。它们大部分是int64。@Rorbinson,你可能想先将它们转换为字符串-我相应地更新了我的答案…效果很好。谢谢。
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