首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >熊猫传播DF到指示DF

熊猫传播DF到指示DF
EN

Stack Overflow用户
提问于 2018-10-15 11:28:59
回答 2查看 132关注 0票数 2

我有这样的数据

代码语言:javascript
复制
import pandas as pd

test = pd.DataFrame(data={"IDX": [0,0,0,1,1,2], 
                          "VAL": [27,5,13,27,24,13]})

   IDX  VAL
0    0   27
1    0    5
2    0   13
3    1   27
4    1   24
5    2   13

并且希望扩展它,以便IDX成为列,VAL成为行名,而实际值只是指示值是否不存在/存在的指标,如下所示:

代码语言:javascript
复制
out = pd.DataFrame(data={"0": [1, 1, 0, 1],
                         "1": [0, 0, 1, 1],
                         "2": [0, 1, 0, 0]}, index=[5, 13, 24, 27])

    0  1  2
5   1  0  0
13  1  0  1
24  0  1  0
27  1  1  0

有没有办法在没有for-循环的情况下有效地做到这一点呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-15 11:31:11

get_dummiesmax结合使用

代码语言:javascript
复制
df = pd.get_dummies(test.set_index('VAL')['IDX'].sort_index()).max(level=0)
print (df)
     0  1  2
VAL         
5    1  0  0
13   1  0  1
24   0  1  0
27   1  1  0

另一种解决方案--按组创建列表,然后使用MultiLabelBinarizer

代码语言:javascript
复制
s = test.groupby('VAL')['IDX'].apply(list)
print (s)
VAL
5        [0]
13    [0, 2]
24       [1]
27    [0, 1]
Name: IDX, dtype: object

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(s),columns=mlb.classes_, index=s.index)
print (df)
     0  1  2
VAL         
5    1  0  0
13   1  0  1
24   0  1  0
27   1  1  0
票数 3
EN

Stack Overflow用户

发布于 2018-10-15 11:42:30

编辑:使用get_dummies。见@jezrael的回答。更正了我在下面使用的crosstabs

pd.crosstab会完成这个任务(如果我们稍微修改一下的话)

pd.crosstab(index=test['VAL'], columns=test['IDX'])

代码语言:javascript
复制
IDX  0  1  2
VAL         
5    1  0  0
13   1  0  1
24   0  1  0
27   1  1  0

由于crosstab对值进行计数,并且不创建像get_dummies这样的指示符,如果我们想使用crosstabs,那么我们必须选择0以上的所有值,并将它们赋值给1。

代码语言:javascript
复制
In [76]: test = pd.DataFrame(data={"IDX": [0,0,0,0,0,1,1,2], 
    ...:                           "VAL": [27,27,27,5,13,27,24,13]})
    ...:                           
    ...:                           
    ...:                           

In [77]: pd.crosstab(index=test['VAL'], columns=test['IDX'])
Out[77]: 
IDX  0  1  2
VAL         
5    1  0  0
13   1  0  1
24   0  1  0
27   3  1  0 <----------- IDX 0 VAL 27 = 3

In [78]: cross_tab = _

In [79]: cross_tab[cross_tab > 0] = 1

In [80]: cross_tab
Out[80]: 
IDX  0  1  2
VAL         
5    1  0  0
13   1  0  1
24   0  1  0
27   1  1  0 <---------- Back to a 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52815779

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档