我有来自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电子表格,只是手动移动数据),这是获得我在这里寻找的唯一方法吗?
答案 0 :(得分:1)
如果您预先处理数据以包含三列,我认为这会更容易: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
。那时,您只需要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