python中按部分标识符分组和重新排序

python中按部分标识符分组和重新排序,python,dataframe,Python,Dataframe,我有来自csv的数据,该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

我有来自csv的数据,该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     e     ue
2007    20      25    17
2008    300     20    10
原始列名中的2007和2008表示日期,但现在不需要是datetime。我最终需要将它们与另一个具有相同“日期”的数据帧合并,但我可以在以后找到答案

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


有没有一个标准化的方法来做这样的事情?或者暴力方式(将其放入excel电子表格并手动移动数据)是获取我在这里寻找的内容的唯一方式吗?

我认为如果您将数据预处理为三列:
,这会容易得多。比如:

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
的数据帧,其列仍然是
key
year
value
。此时,您只需:


最后,您将得到需要清理的多索引行/列,但我将把它留给您。

我认为,如果您将数据预处理为三列:
,这将更加容易。比如:

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
的数据帧,其列仍然是
key
year
value
。此时,您只需:


您将得到需要清理的多索引行/列,但我将留给您。

您可以生成列多索引:

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

您可以生成列多索引:

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

这个可能的重复解决了我几乎100%的问题,对提供的答案做了一些轻微的修改。我仍然希望解决一个领域,但我确信我能解决这个问题。我将提供一个更新我的问题简短的可能的副本解决了几乎100%的我的问题与一些轻微的修改提供的答案。我仍然希望解决一个领域,但我确信我能解决这个问题。我将很快更新我的问题