即使这个任务得到了回答,我有一个更快的解决方案:
df.groups.apply(lambda x: pd.Series([1] * len(x), index=x)).fillna(0, downcast='infer')
而且,如果您有空组或NaN,您可以:
df.loc[df.groups.str.len() > 0].apply(lambda x: pd.Series([1] * len(x), index=x)).fillna(0, downcast='infer')
工作原理
在 lambda 内部,x 是您的列表,例如 ['a', 'b', 'c']。所以pd.Series会如下:
In [2]: pd.Series([1, 1, 1], index=['a', 'b', 'c'])
Out[2]:
a 1
b 1
c 1
dtype: int64
当所有pd.Series 聚集在一起时,它们变成pd.DataFrame,它们的index 变成columns;丢失的index 变成了column 和NaN,如下所示:
In [4]: a = pd.Series([1, 1, 1], index=['a', 'b', 'c'])
In [5]: b = pd.Series([1, 1, 1], index=['a', 'b', 'd'])
In [6]: pd.DataFrame([a, b])
Out[6]:
a b c d
0 1.0 1.0 1.0 NaN
1 1.0 1.0 NaN 1.0
现在fillna 用0 填充那些NaN:
In [7]: pd.DataFrame([a, b]).fillna(0)
Out[7]:
a b c d
0 1.0 1.0 1.0 0.0
1 1.0 1.0 0.0 1.0
而downcast='infer' 是从float 向下转换为int:
In [11]: pd.DataFrame([a, b]).fillna(0, downcast='infer')
Out[11]:
a b c d
0 1 1 1 0
1 1 1 0 1
PS.:不需要使用.fillna(0, downcast='infer')。