2017-03-08 83 views
4

我試圖將一個pandas DataFrame列收集到一個鍵值對中,並將它列爲python中的一行。如果我們把下面的數據幀爲例,我想從這裏去:如何將DataFrame列收集到鍵值對中作爲Python中的行

import pandas as pd 
from collections import OrderedDict 

df = pd.DataFrame({'value_2016': [200], 
        'value_2017': [300], 
        'value_2018': [float('NaN')]}) 
print(df) 

    value_2016 value_2017 value_2018 
0   200   300   NaN 

到:

df_result = pd.DataFrame(OrderedDict({'year': [2016, 2017], 
             'value': [200, 300]})) 

print(df_result) 

    year value 
0 2016 200 
1 2017 300 

如果你是R中熟悉的等價會是這樣的:

require("plyr"); require("dplyr"); require(tidyr) 

df <- data.frame(value_2016 = 200, 
       value_2017 = 300, 
       value_2018 = NA) 

df %>% 
    gather(year, value, value_2016:value_2018) %>% 
    mutate(year = gsub(x = .$year, replacement = "", "value_")) %>% 
    na.exclude 

    year value 
    1 2016 200 
    2 2017 300 

任何幫助將非常酷!

回答

1

您可以通過split創建MultiIndex然後stack重塑:

df.columns = df.columns.str.split('_', expand=True) 
df = df.stack().reset_index(level=0, drop=True).rename_axis('year').reset_index() 
#if necessary convert float to int 
df.value = df.value.astype(int) 
print (df) 
    year value 
0 2016 200 
1 2017 300 

如果想使用DataFrame構造函數中使用get_level_values

df.columns = df.columns.str.split('_', expand=True) 
df = df.stack() 

df_result = pd.DataFrame(OrderedDict({'year': df.index.get_level_values(1), 
             'value': df['value'].astype(int).values})) 

print(df_result) 
    year value 
0 2016 200 
1 2017 300 
+0

確定這看起來不錯..謝謝 – Codutie

0

你可以使用renamestackreset_index

In [4912]: (df.rename(columns=lambda x: x.split('_')[-1]).stack() 
       .reset_index(level=0, drop=True) 
       .rename_axis('year') 
       .reset_index(name='value')) 
Out[4912]: 
    year value 
0 2016 200.0 
1 2017 300.0 
相關問題