在python

时间:2018-02-24 00:46:55

标签: python dataframe

我有来自csv的数据,它产生的数据框如下所示:

d = {"clf_2007": [20],
    "e_2007": [25],
    "ue_2007": [17],
    "clf_2008": [300],
    "e_2008": [20],
    "ue_2008": [10]}
df = pd.DataFrame(d)

产生一个数据框(原谅我不知道如何正确地将其编码到stackoverflow中)

   clf_2007     clf_2008    e_2007  e_2008  ue_2007    ue_2008
0   20            300         25       20      17         10

我想操纵该数据以产生如下所示的内容:

        clf     e     ue
2007    20      25    17
2008    300     20    10

2007和2008年原始列名称代表日期,但它们现在不需要成为日期时间。我需要将它们与另一个具有相同"日期"的数据帧合并。最终,但我可以稍后再说明。

到目前为止,我已经尝试过groupbys并且我已经通过字符串索引(比如str [:8])等尝试过它们,并且除了它之外没有工作,我甚至都没有认为groupby是正确的工具。我也尝试过pd.PeriodIndex,但是,这对我来说似乎不是正确的工具。

有没有标准化的方法来做这样的事情?或者是蛮力的方式(把它变成excel电子表格,只是手动移动数据),这是获得我在这里寻找的唯一方法吗?

2 个答案:

答案 0 :(得分:1)

如果您预先处理数据以包含三列,我认为这会更容易:keyyearvalue。类似的东西:

rows = []
for k, v in d.iteritems():
    key, year = k.split("_")
    for val in v:
        rows.append({'key': key, 'year': year, 'value': val})

将这些行放入数据框中,将其命名为dfA。我假设您对每个(key, year)对可能有多个值,并且您希望以某种方式聚合它们。我假设您这样做并最终得到一个名为df的数据框,其列仍为keyyearvalue。那时,您只需要pivot

pd.pivot_table(df,index=['year'], columns=['key'])

您最终会想要清理多个索引的行/列,但我会留给您。

答案 1 :(得分:1)

您可以生成列多索引:

df.columns = pd.MultiIndex.from_tuples([col.split("_") for col in df])
print(df.columns)
#   clf         e        ue     
#  2007 2008 2007 2008 2007 2008

然后堆叠表:

df = df.stack()
print(df)
#        clf   e  ue
#0 2007   20  25  17
#  2008  300  20  10

您也可以选择展平索引:

df.index = df.index.get_level_values(1)
print(df)
#      clf   e  ue
#2007   20  25  17
#2008  300  20  10