如何将项目列表转换为熊猫列?

时间:2019-05-06 16:56:38

标签: python

我正在尝试将defaultdict(list)中的某些分类值转换为熊猫数据框的列。例如,这是我的字典:

{"user1": ["id1", "id2"], "user2": ["id2", "id3"]} 

,预期的输出是将user1user2作为行,并将id1id2id3作为列,其值为{{1 }},如果该1出现在用户列表中,则id否则。

我创建了一个字典,并使用一个嵌套的for循环来遍历唯一的用户和id并创建输出,但这确实很慢。我想知道什么是更有效的方法?

3 个答案:

答案 0 :(得分:0)

为什么不使用内置的from_dict熊猫?

data = {"user1": ["id1", "id2"], "user2": ["id2", "id3"]}

df = pd.DataFrame.from_dict(data)

df
  user1 user2
0   id1   id2
1   id2   id3

或者如果您要行:

data = {"user1": ["id1", "id2"], "user2": ["id2", "id3"]}

df = pd.DataFrame.from_dict(data, orient='index')

df
         0    1
user2  id2  id3
user1  id1  id2

答案 1 :(得分:0)

请尝试

import pandas as pd

data = {"user1": ["id1", "id2"], "user2": ["id2", "id3"]}

rows = []
cols = [] 

for key, val in data.items() : 
      for v in val :  
        cols.append(v)

cols = list(set(cols)) 

df = pd.DataFrame(columns=cols) 

print(df)

#rows.append(key)

for key, val in data.items() : 
          row = [] 
          for col in cols : 
            if col not in val : 
              row.append("nan")
             #dft = pd.DataFrame(["NaN"],columns=col)
            else :
              row.append(key)
             #dft = pd.DataFrame([key],columns=col)
          dft = pd.DataFrame([row],columns=cols)


          df = df.append(dft)

df = df.reindex(sorted(df.columns), axis=1)
print(df)

输出

     id1    id2    id3
0  user1  user1    nan
0    nan  user2  user2

答案 2 :(得分:0)

您所需的输出并不十分清楚,但是据我了解,这是一个在纯熊猫中没有循环的解决方案。如果您要这样做,我建议您查看每个步骤的结果(以多行格式提供,以便于注释)

根据注释中提供的新信息,针对具有不同长度值(根据this question改编的字典):

d={"user1": ["id1", "id2", "id3"], "user2": ["id2", "id3"], "user3":["id1"]}
df=pd.DataFrame.from_dict(d, orient='index')    
df
        0   1   2
user1   id1 id2 id3
user2   id2 id3 None
user3   id1 NoneNone

pd.get_dummies(df.unstack())\
.reset_index()\
.drop('level_0', axis=1)\
.groupby('level_1')\
.sum()

        id1 id2 id3
level_1         
user1   1   1   1
user2   0   1   1
user3   1   0   0