在没有唯一值的python数据帧中迭代

在没有唯一值的python数据帧中迭代,python,pandas,numpy,Python,Pandas,Numpy,我在python中重新排列数据帧时遇到了麻烦,它是从CSV文件生成的,我需要它。数据帧中的数据如下所示: ID VOLUME DATETIME 900 2.36 11/01/2015 13:40 900 2.30 11/01/2015 13:40 900 2.18 11/01/2015 13:41 900 2.30 11/01/2015 13:41 901 1.88

我在python中重新排列数据帧时遇到了麻烦,它是从CSV文件生成的,我需要它。数据帧中的数据如下所示:

ID      VOLUME      DATETIME

900     2.36        11/01/2015 13:40
900     2.30        11/01/2015 13:40
900     2.18        11/01/2015 13:41
900     2.30        11/01/2015 13:41
901     1.88        07/01/2015 17:01
901     1.80        07/01/2015 17:01
901     1.73        07/01/2015 17:02
901     1.80        07/01/2015 17:02
我尝试了各种方法来将上面的内容转换为我需要的内容,但由于字段没有真正的唯一值,我无法这样做。我一直在想,我需要使用iterrows来获取我需要的信息,但还没有弄明白。 这就是我获取数据的方式:

    900↓    901↓

    2.36    1.88
    2.30    1.80
    2.18    1.73
    2.30    1.80

我试图在ID列中每个项目显示一列,但我真的开始在这一列上撞到墙上了。我可以如上所述创建一个新的数据帧吗?还是我的做法是错误的?

当您的ID具有不同行数时的解决方案:

In [34]: df
Out[34]:
    ID  VOLUME          DATETIME
0  900    2.36  11/01/2015 13:40
1  900    2.30  11/01/2015 13:40
2  900    2.18  11/01/2015 13:41
3  900    2.30  11/01/2015 13:41
4  901    1.88  07/01/2015 17:01
5  901    1.80  07/01/2015 17:01
6  901    1.73  07/01/2015 17:02
7  901    1.80  07/01/2015 17:02
8  901    1.11  07/01/2015 17:03   # NOTE: i've intentionally added this row

In [35]: pd.DataFrame({k : pd.Series(v)
                       for k, v in df.groupby('ID').VOLUME.apply(list).to_dict().items()})
Out[35]:
    900   901
0  2.36  1.88
1  2.30  1.80
2  2.18  1.73
3  2.30  1.80
4   NaN  1.11
旧答案:

试试这个:

In [12]: pd.DataFrame(df.groupby('ID').VOLUME.apply(list).to_dict())
Out[12]:
    900   901
0  2.36  1.88
1  2.30  1.80
2  2.18  1.73
3  2.30  1.80
或:


注意:如果您的
ID
的行数相同,那么这将起作用。对于具有不同行数的ID的情况,解决方案是:

In [34]: df
Out[34]:
    ID  VOLUME          DATETIME
0  900    2.36  11/01/2015 13:40
1  900    2.30  11/01/2015 13:40
2  900    2.18  11/01/2015 13:41
3  900    2.30  11/01/2015 13:41
4  901    1.88  07/01/2015 17:01
5  901    1.80  07/01/2015 17:01
6  901    1.73  07/01/2015 17:02
7  901    1.80  07/01/2015 17:02
8  901    1.11  07/01/2015 17:03   # NOTE: i've intentionally added this row

In [35]: pd.DataFrame({k : pd.Series(v)
                       for k, v in df.groupby('ID').VOLUME.apply(list).to_dict().items()})
Out[35]:
    900   901
0  2.36  1.88
1  2.30  1.80
2  2.18  1.73
3  2.30  1.80
4   NaN  1.11
旧答案:

试试这个:

In [12]: pd.DataFrame(df.groupby('ID').VOLUME.apply(list).to_dict())
Out[12]:
    900   901
0  2.36  1.88
1  2.30  1.80
2  2.18  1.73
3  2.30  1.80
或:


注意:如果您的
ID
的行数相同,这将起作用。非常感谢。我正试图掌握dataframe,老实说,我花了一周的时间试图弄明白这一点。我的行有不同数量的ID,所以我很感激你覆盖了所有的途径,它甚至没有越过我的脑海。“OldManEast,很高兴我能帮助:”请考虑一个答案,如果你认为它已经回答了你的问题,非常感谢。我正试图掌握dataframe,老实说,我花了一周的时间试图弄明白这一点。我的行有不同数量的ID,所以我很感激你覆盖了所有的途径,它甚至没有越过我的脑海。“OldManEast,很高兴我能帮助:”请考虑一个答案,如果你认为它已经回答了你的问题。