python中按部分标识符分组和重新排序
我有来自csv的数据,该csv生成的数据帧如下所示: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
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%的我的问题与一些轻微的修改提供的答案。我仍然希望解决一个领域,但我确信我能解决这个问题。我将很快更新我的问题