2017-03-08 85 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 
相关问题