我在下面有一个问题 - 我需要将多行ID转换为一行,并让不同的“输出”值成为二进制1/0的列,例如。
这是我的桌子!
ID Output Timestamp 1 out1 1501 1 out2 1501 1 out5 1501 1 out9 1501 2 out3 1603 2 out4 1603 2 out9 1603
转变为以下内容:
ID out1 out2 out3 out4 out5 out9 timestamp 1 1 1 0 0 1 1 1501 2 0 0 1 1 0 1 1603
有人可以帮助我以灵活的方式在Python中执行此操作,最好是Pandas吗?我对此很陌生,多年来一直使用SAS,因此非常感谢任何“过渡技巧”。
BR,
答案 0 :(得分:1)
你可以使用一个支点:
pivoted = df.pivot('ID', 'Output', 'ID')
pivoted.fillna(0, inplace=True)
pivoted[pivoted > 0] = 1
pd.merge(pivoted.reset_index(), df[['ID', 'Timestamp']].drop_duplicates(), left_on='ID', right_on='ID')
pivoted
结果:
Output ID out1 out2 out3 out4 out5 out9 Timestamp
0 1 1 1 0 0 1 1 1501
1 2 0 0 1 1 0 1 1603
答案 1 :(得分:0)
你需要创建一个字典,其中键是id。其中的每个值都将是另一个outN到值的字典。
读一行。你得到一个id,outN和一个值。检查您是否首先获得该ID的字典,如果没有,请创建一个。然后将该outN的值推入该id的字典中。
第二步:您需要收集所有outN的列表。制作一套新的。对于dict中的每个值,将每个outN键添加到您的集合中。最后,从集合中获取一个列表,然后对其进行排序。
第三步:浏览你的dict键中的每个id,然后在你的新排序的outn列表中输出每个id,并打印其值,后退为零。 outnval_by_ids[id].get(outn, "0")
这里有一个奇怪的案例,因为你有很多时间戳,你假设它们是由id复制的。小心,事实确实如此。这样的假设会导致错误。