2016-05-12 61 views
2

我目前面臨正在採取大熊貓數據幀,有效地採取每個記錄並將其分解成多個記錄以下列方式問題:大熊貓:拆分一行到多行高效

輸入:

In [16]: pd.DataFrame({'Name': 'Person1', 'State': 'Indiana', 'Money1': 100.42, 'Money2':54.54, 'Money3': 23.45}, index=[1]) 
Out[16]: 
    Money1 Money2 Money3 Name  State 
1 100.42 54.54 23.45 Person1 Indiana 

輸出:

Money1 Money2 Money3 Name  State 
1 100.42 np.nan np.nan Person1 Indiana 
2 np.nan 54.54 np.nan Person1 Indiana  
3 np.nan np.nan 23.45 Person1 Indiana 

本質上來說,問題是分裂原紀錄爲X個記錄,其中x是在柱後通過(i拆分列表在這種情況下,'Money1','Money2','Money3'。我曾嘗試通過創建DataFrames並將它們連接起來,但這非常緩慢且內存效率低下。

EDIT1:

請不,答案不一樣,如果你的靜態列(即都變成了多指標的那些)甚至一個充滿不同的NaN工作。這是大熊貓報告的錯誤: https://github.com/pydata/pandas/issues/6322

要解決它,使用fillnareplace填寫完全的NaN與空字符串''包括列,例如,然後在這個過程之後,把NaN回。

回答

1

這應該適用於具有任意數量列的數據幀。

df = pd.DataFrame({'Name': ['Person1', 'Person2'], 
        'State': ['Indiana', 'NY'], 
        'Money1': [100.42, 200], 
        'Money2': [54.54, 25], 
        'Money3': [23.45, 10]}) 

index_cols = ['Name', 'State'] 
cols = [c for c in df if c not in index_cols] 

df2 = df.set_index(index_cols).stack().reset_index(level=2, drop=True).to_frame('Value') 

df2 = pd.concat([pd.Series([v if i % len(cols) == n else np.nan 
          for i, v in enumerate(df2.Value)], name=col) 
       for n, col in enumerate(cols)], axis=1).set_index(df2.index) 

>>> df2.reset_index() 
     Name State Money1 Money2 Money3 
0 Person1 Indiana  1  NaN  NaN 
1 Person1 Indiana  NaN  55  NaN 
2 Person1 Indiana  NaN  NaN  23 
3 Person2  NY  2  NaN  NaN 
4 Person2  NY  NaN  25  NaN 
5 Person2  NY  NaN  NaN  10 
+0

調用'df2.reset_index(drop = False)'在上述過程之後將其轉換爲我想要的格式。 – Zeke