【问题标题】:I have DataFrame's columns and data in list i want to put the relevant data to relevant column我在列表中有 DataFrame 的列和数据,我想将相关数据放入相关列
【发布时间】:2020-04-10 16:27:58
【问题描述】:

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

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

【问题讨论】:

  • 您需要计数值或指标吗?这意味着如果将hat 的第一行中的['hat','tie'] 更改为['hat','tie', 'hat']1 指标或2 计数?

标签: python-3.x pandas dataframe dummy-variable


【解决方案1】:

如果想要由01 填充的指标列,仅使用MultiLabelBinarizerDataFrame.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

【讨论】:

  • ------------------------------------------ --------------------------------- NameError Traceback(最近一次调用最后一次) 1 from sklearn.preprocessing import MultiLabelBinarizer 2 mlb = MultiLabelBinarizer() ----> 3 df = (pd.DataFrame(mlb.fit_transform(data),columns =mlb.classes_).reindex(columns, axis= 1, fill_value=0)) NameError: name 'columns' is not defined
  • @DarkstarDream - 来自您的解决方案columns = ['shirt','shoe','tie','hat']
【解决方案2】:

这是使用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

【讨论】:

    【解决方案3】:

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

    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() 返回一个 MultiIndex 系列:

    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 之后只会有1或0):

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

    【讨论】:

    • 这很奇怪。你确定你使用的是我写的确切代码吗?也没有错误?
    • 对不起,它现在可以正常工作了,也许我遇到了任何技术问题,谢谢兄弟
    • 没问题 :) 如果它回答了您的问题,您可以接受该解决方案。
    猜你喜欢
    • 1970-01-01
    • 2013-12-19
    • 1970-01-01
    • 2017-01-02
    • 2016-12-20
    • 2012-07-03
    • 1970-01-01
    • 2022-09-22
    • 1970-01-01
    相关资源
    最近更新 更多