即使这个任务得到了回答,我有一个更快的解决方案:
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')。