Python在多列中搜索字符串以设置分类变量值

2024-04-19 04:58:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我对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.d类型演出

AGE                      int64
DISPUNIFORM              int64
DRG                      int64
DRGVER                   int64
Readmit_30D              int64
DXCCS1                   int64
DXCCS2                   int64
DXCCS3                   int64
DXCCS4                   int64
...on to DXCCS30

Tags: 数据字符串falsetruepandas硬件选项etc
2条回答

^{}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:

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

相关问题 更多 >