按时间戳分组单个CSV文件 - Pandas

时间:2017-04-20 23:08:40

标签: python-3.x pandas

我有一个几乎无穷无尽的水平csv,其中变量在标题中传播,我有许多重复的时间戳,导致这样的场景:

+------------+------------+------------+------------+
| Timestamp  |  Variable1 |  Variable2 |    ....    |
+------------+------------+------------+------------+
| 2017/02/12 |     20     |            |            |  
| 2017/02/13 |     20     |            |            |   
| 2017/02/14 |     30     |            |            |
| 2017/02/12 |            |     5      |            |
| 2017/02/13 |            |     2      |            |
| 2017/02/14 |            |     10     |            |
|    ...     |            |            |            |
+------------+------------+------------+------------+

我正在尝试通过时间戳连接以获得这样的结果:

+------------+------------+------------+------------+
| Timestamp  |  Variable1 |  Variable2 |    ....    |
+------------+------------+------------+------------+
| 2017/02/12 |     20     |     5      |            |   
| 2017/02/13 |     20     |     2      |            |   
| 2017/02/14 |     30     |     10     |            |
+------------+------------+------------+------------+

我在熊猫中比较新,但我觉得这可以通过多个数据帧轻松完成,但我有点怀疑对一个数据帧进行分组。任何人都可以帮我一把吗?非常感谢你!

4 个答案:

答案 0 :(得分:4)

您可以按时间戳分组并合并值

df.groupby('Timestamp')['Variable1', 'Variable2'].apply(lambda x: x.sum()).reset_index()

你得到了

    Timestamp   Variable1   Variable2
0   2017/02/12  20          5
1   2017/02/13  20          2
2   2017/02/14  30          10

编辑:感谢@piRSquared

更通用
df.set_index('Timestamp').groupby(level=0).sum().reset_index‌​()

答案 1 :(得分:1)

我使用pd.concat + pd.DataFrame.iteritems

pd.concat([s.dropna() for c, s in df.set_index('Timestamp').iteritems()], axis=1)

            Variable1  Variable2
Timestamp                       
2017/02/12       20.0        5.0
2017/02/13       20.0        2.0
2017/02/14       30.0       10.0

reset_index

pd.concat(
    [s.dropna() for c, s in df.set_index('Timestamp').iteritems()],
    axis=1
).reset_index()

    Timestamp  Variable1  Variable2
0  2017/02/12       20.0        5.0
1  2017/02/13       20.0        2.0
2  2017/02/14       30.0       10.0

答案 2 :(得分:1)

最简单的解决方案:

带参数level=0

set_index + DataFrame.sum

df = df.set_index('Timestamp').sum(level=0)
print (df)
            Variable1  Variable2
Timestamp                       
2017/02/12       20.0        5.0
2017/02/13       20.0        2.0
2017/02/14       30.0       10.0

df = df.set_index('Timestamp').sum(level=0).reset_index()
print (df)
    Timestamp  Variable1  Variable2
0  2017/02/12       20.0        5.0
1  2017/02/13       20.0        2.0
2  2017/02/14       30.0       10.0

groupby + GroupBy.sum

df = df.groupby('Timestamp').sum()
print (df)
            Variable1  Variable2
Timestamp                       
2017/02/12       20.0        5.0
2017/02/13       20.0        2.0
2017/02/14       30.0       10.0
df = df.groupby('Timestamp').sum().reset_index()
print (df)
    Timestamp  Variable1  Variable2
0  2017/02/12       20.0        5.0
1  2017/02/13       20.0        2.0
2  2017/02/14       30.0       10.0

答案 3 :(得分:0)

使用与.groupby()

链接的.sum()

df_grouped = df.groupby('Timestamp').sum()

通过对该组的每列进行求和,按组聚合数据(在本例中为Timestamp)。在您的示例中,每个列每个日期都有一个条目,因此求和应提供正确的解决方案。