我在列表中有 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
如果希望由 0
和 1
填充的指标列仅使用 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
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')
假设您已经给出了您可以拥有的所有项目的列表,并且您有单独的数据列表并且其列表的形状不固定它可能包含您希望从中创建数据框的任意数量的项目并且您必须把它放在写栏 例如
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
如果希望由 0
和 1
填充的指标列仅使用 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
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')