我正在尝试将defaultdict(list)
中的某些分类值转换为熊猫数据框的列。例如,这是我的字典:
{"user1": ["id1", "id2"], "user2": ["id2", "id3"]}
,预期的输出是将user1
和user2
作为行,并将id1
,id2
,id3
作为列,其值为{{1 }},如果该1
出现在用户列表中,则id
否则。
我创建了一个字典,并使用一个嵌套的for循环来遍历唯一的用户和id并创建输出,但这确实很慢。我想知道什么是更有效的方法?
答案 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