2014-01-25 80 views
1

通常會發生這樣的情況:數據將以包裝列的形式提供給您。舉個例子:熊貓:在csv文件中展平重複/包裹的列

CCY Decimals  CCY Decimals  CCY Decimals 
AUD/CAD   5 EUR/CZK   4 GBP/NOK   5 
AUD/CHF   5 EUR/DKK   5 GBP/NZD   5 
AUD/DKK   5 EUR/GBP   5 GBP/PLN   5 
AUD/JPY   3 EUR/HKD   5 GBP/SEK   5 
AUD/NOK   5 EUR/HUF   3 GBP/SGD   5 
... 

哪些應該被解析爲列(CCY和小數),不是6的數據幀。我的問題是,實現這一目標的最習慣方式是什麼?

我本來想要像下面這樣:數據幀的

data = pd.read_csv("file.csv") 
data.groupby(axis=1,by=data.columns.map(lambda s: s.replace("\..",""))).\ 
    apply(lambda df : df.values.flatten()) 

當閱讀我們最終Decimals.1CCYDecimalsCCY.1,CSV文件..等。groupby操作返回一個集合:

<pandas.core.groupby.DataFrameGroupBy object at 0x3a52b10> 

然後我們將使用numpy功能將其扁平化。所以我們會將重複列的DataFrame轉換爲Series,然後將它們合併到一個結果DF中。

但是,這不起作用。我試過將不同的keys參數傳遞給groupBy,但它總是抱怨無法重新索引非唯一列。

有許多現存的問題都涉及列組的扁平化(例如"Flattening" output of group.nth in Pandas),但我找不到任何重複列的操作。

回答

3

要使用groupby,我會做:

>>> groups = df.groupby(axis=1,by=lambda x: x.rsplit(".",1)[0]) 
>>> pd.DataFrame({k: v.values.flat for k,v in groups}) 
     CCY Decimals 
0 AUD/CAD   5 
1 EUR/CZK   4 
2 GBP/NOK   5 
3 AUD/CHF   5 
4 EUR/DKK   5 
5 GBP/NZD   5 
6 AUD/DKK   5 
7 EUR/GBP   5 
8 GBP/PLN   5 
9 AUD/JPY   3 
10 EUR/HKD   5 
11 GBP/SEK   5 
12 AUD/NOK   5 
13 EUR/HUF   3 
14 GBP/SGD   5 

[15 rows x 2 columns] 

,然後排序。