Python多行到一行

时间:2015-10-21 13:54:40

标签: python pandas group-by

我在下面有一个问题 - 我需要将多行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,

2 个答案:

答案 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复制的。小心,事实确实如此。这样的假设会导致错误。