我试图将pandas数据框列收集到一个键值对中,并在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

任何帮助都很酷!

最佳答案

您可以通过MultiIndex创建split,然后通过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

如果需要,请使用构造函数:
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

07-24 09:52