2017-04-20 54 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()

此聚集由組的數據(在這種情況下,時間戳)該組。在你的例子中,每個列每個日期有一個條目,所以總結應該提供正確的解決方案。