我在列表中有 DataFrame 的列和数据我想将相关数据放入相关列

I have DataFrame's columns and data in list i want to put the relevant data to relevant column

假设您已经给出了您可以拥有的所有项目的列表,并且您有单独的数据列表并且其列表的形状不固定它可能包含您希望从中创建数据框的任意数量的项目并且您必须把它放在写栏 例如

columns = ['shirt','shoe','tie','hat']
data = [['hat','tie'],
        ['shoe', 'tie', 'shirt'],
        ['tie', 'shirt',]]
# and from this I wants to create a dummy variable like this 
  shirt  shoe  tie  hat
0   0     0     1    1
1   1     1     1    0
2   1     0     1    0

如果希望由 01 填充的指标列仅使用 MultiLabelBinarizer with DataFrame.reindex 如果希望按列表更改列的排序并且如果可能某些值不存在仅添加 0栏目:

columns = ['shirt','shoe','tie','hat']
data = [['hat','tie'],
        ['shoe', 'tie', 'shirt'],
        ['tie', 'shirt',]]

from sklearn.preprocessing import MultiLabelBinarizer

mlb = MultiLabelBinarizer()
df = (pd.DataFrame(mlb.fit_transform(data),columns=mlb.classes_)
        .reindex(columns, axis=1, fill_value=0))
print (df)
   shirt  shoe  tie  hat
0      0     0    1    1
1      1     1    1    0
2      1     0    1    0

Series.str.get_dummies:

df = pd.Series(data).str.join('|').str.get_dummies().reindex(columns, axis=1, fill_value=0)
print (df)
   shirt  shoe  tie  hat
0      0     0    1    1
1      1     1    1    0
2      1     0    1    0

这是一种使用 collections.Counter 的方法。

例如:

from collections import Counter
columns = ['shirt','shoe','tie','hat']
data = [['hat','tie'],
        ['shoe', 'tie', 'shirt'],
        ['tie', 'shirt']]

data = map(Counter, data)
#df = pd.DataFrame(data, columns=columns)
df = pd.DataFrame(data, columns=columns).fillna(0).astype(int)

print(df)

输出:

   shirt  shoe  tie  hat
0      0     0    1    1
1      1     1    1    0
2      1     0    1    0

您可以尝试将数据转换为数据帧:

data = [['hat','tie'],
        ['shoe', 'tie', 'shirt'],
        ['tie', 'shirt',]]

df = pd.DataFrame(data)
df

     0       1      2
0   hat     tie     None
1   shoe    tie     shirt
2   tie    shirt    None

他们使用:

pd.get_dummies(df.stack()).groupby(level=0).agg('sum')

   hat  shirt   shoe    tie
0   1   0       0       1
1   0   1       1       1
2   0   1       0       1

解释:

df.stack() returns 多指数系列:

0  0      hat
   1      tie
1  0     shoe
   1      tie
   2    shirt
2  0      tie
   1    shirt
dtype: object

如果我们得到这个系列的虚拟值,我们会得到:

       hat  shirt    shoe   tie
0   0   1   0           0       0
    1   0   0           0       1
1   0   0   0           1       0
    1   0   0           0       1
    2   0   1           0       0
2   0   0   0           0       1
    1   0   1           0       0

然后你只需要对索引进行分组并使用sum合并它们(因为我们知道get_dummies之后只会有一个或零):

df = pd.get_dummies(df.stack()).groupby(level=0).agg('sum')