2017-04-20 56 views
2

我有一个几乎是无限的水平CSV其中的变量是整个头铺展和我有很多重复的时间戳导致的情景是这样的:集团通过时间戳一个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  |   | 
+------------+------------+------------+------------+ 

林在大熊猫相对较新,但我觉得这可以轻松使用多个dataframes但即时通讯有一个小疑问分组单数据帧进行。任何人都可以帮我一把吗?非常感谢你!

回答

3

可以GROUPBY时间戳和组合的值

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

+0

变量太多了。我可以在括号中应用相同种类的df.columns [1:-1]吗? :) –

+2

'df.set_index('Timestamp').groupby(level = 0).sum()。reset_index()' – piRSquared

+0

@piRSquared,谢谢! – Vaishali

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 
+0

嗨,谢谢你,我试过你的解决方案,我得到一个ValueError:不能从重复的轴重新索引。任何想法? –

+0

这是因为您的列中存在值的重复日期。这可能是因为你有空字符串''''而不是'None'或'NaN'。 **如果**是这种情况,你可以试试'df.replace({'':None},).set_index('Timestamp')。iteritems()'来代替'df.set_index('Timestamp' ).iteritems()' – piRSquared

1

Simpliest解决方案:

set_index + DataFrame.sum与参数level=0

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 
0

使用.groupby()由求和每个列于链带.sum()

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

此聚集由组的数据(在这种情况下,时间戳)该组。在你的例子中,每个列每个日期有一个条目,所以总结应该提供正确的解决方案。