如何将大小不等的字典和元素列表转换为具有1和0值的数据帧

2024-09-21 03:18:10 发布

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

我正在使用python 3.7.6

我有一本字典如下:

key   - string
value - list of strings

值(列表)的大小不同

例如:

 {'GP': ['col_1', 'col_2', 'col_3', 'col_4'], 
 'MIN': ['col_1', 'col_2', 'col_3', 'col_4'],
 'PTS': ['col_1', 'col_2', 'col_3', 'col_4'], 
 'FGM': ['col_1', 'col_2', 'col_4'], 
 'FGA': ['col_2'], 
 'FG%': ['col_2', 'col_3', 'col_4'],
 '3P Made': ['col_2', 'col_3'], 
 'AST': ['col_2', 'col_3'], 
 'STL': ['col_2'], 
 'BLK': ['col_2', 'col_3'],
 'TOV': ['col_3']}

我想将此字典转换为Dataframe,其中键是行,列是列表值,内容是1或0(取决于行是否具有列表值):

            col_1       col_2       col_3    col_4  
 GP           1         1           1           1
 MIN          1         1           1           1 
 PTS          1         1           1           1 
 FGM          1         1           0           1 
 FGA          0         1           0           0 
 FG%          0         1           1           1
 3P Made      0         1           1           0
 AST          0         1           1           0
 STL          0         1           0           0
 BLK          0         1           1           0
 TOV          0         0           1           0

我怎么做


Tags: key列表string字典colminastpts
2条回答

^{}与词典的d.keys()d.values()一起使用:

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = pd.DataFrame(mlb.fit_transform(d.values()), index=d.keys(),columns=mlb.classes_)
print (df)
         col_1  col_2  col_3  col_4
GP           1      1      1      1
MIN          1      1      1      1
PTS          1      1      1      1
FGM          1      1      0      1
FGA          0      1      0      0
FG%          0      1      1      1
3P Made      0      1      1      0
AST          0      1      1      0
STL          0      1      0      0
BLK          0      1      1      0
TOV          0      0      1      0

Pandas是唯一的解决方案,但是Series^{}^{}的速度较慢:

df = pd.Series(d).str.join('|').str.get_dummies()

您可以创建一个系列explode它,然后将get_dummiessum一起使用:

pd.get_dummies(pd.Series(d).explode()).sum(level=0)

或者您可以玩分解的系列和unstack

(pd.Series(d).explode()
   .to_frame(name='cols')
   .assign(values=1)
   .set_index('cols', append=True)['values']
   .unstack('cols', fill_value=0)
)

输出:

         col_1  col_2  col_3  col_4
GP           1      1      1      1
MIN          1      1      1      1
PTS          1      1      1      1
FGM          1      1      0      1
FGA          0      1      0      0
FG%          0      1      1      1
3P Made      0      1      1      0
AST          0      1      1      0
STL          0      1      0      0
BLK          0      1      1      0
TOV          0      0      1      0

相关问题 更多 >

    热门问题