Python 在创建新的组合列名时将多个datetimeIndex组合到一行中
我有一个类似这样的df,我希望每行只有一个唯一的datetime索引。有5个唯一的Python 在创建新的组合列名时将多个datetimeIndex组合到一行中,python,pandas,Python,Pandas,我有一个类似这样的df,我希望每行只有一个唯一的datetime索引。有5个唯一的cat_idx值和3个唯一的dt_idx值。新的df需要有15列。(5个唯一的cat_idx*3个唯一的dt_idx) 我想要的输出df每行有一个唯一的datetime APERMITE_SINGLE APERMITE_MULTI APERMITE_TOT AUTHNOTSTD_SINGLE AUTHNOTSTD_MULTI AUTHNOTSTD_TOT AS
cat_idx
值和3个唯一的dt_idx
值。新的df需要有15列。(5个唯一的cat_idx
*3个唯一的dt_idx
)
我想要的输出df每行有一个唯一的datetime
APERMITE_SINGLE APERMITE_MULTI APERMITE_TOT AUTHNOTSTD_SINGLE AUTHNOTSTD_MULTI AUTHNOTSTD_TOT ASTARTS_SINGLE ASTARTS_MULTI ASTARTS_TOT UNDERCONST_SINGLE UNDERCONST_MULTI UNDERCONST_TOT ACOMPLETIONS_SINGLE ACOMPLETIONS_MULTI ACOMPLETIONS_TOT
per_idx
2002-01-01 1285.0 311.0 1665.0 89.0 46.0 139.0 1318.0 311.0 1698.0 669.0 297.0 996.0 1324.0 297.0 1632.0
这个数据示例只有一个datetime戳,我需要遍历datetime索引,并在每个datetime中生成类似的行。
我不知道该怎么做,但在搜索了类似的问题后,我得到了类似的值或名称,而我需要创建新的列
另外,如果标题可以改进,请让我知道,因为我不完全确定如何表达这个问题。我从您在顶部发布的字符串中创建了一个数据框,这不完全相同,因为我删除了多级索引:
data="""per_idx cat_idx dt_idx val
2002-01-01 APERMITE TOTAL 1665.0
2002-01-01 APERMITE SINGLE 1285.0
2002-01-01 APERMITE MULTI 311.0
2002-01-01 AUTHNOTSTD TOTAL 139.0
2002-01-01 AUTHNOTSTD SINGLE 89.0
2002-01-01 AUTHNOTSTD MULTI 46.0
2002-01-01 ASTARTS TOTAL 1698.0
2002-01-01 ASTARTS SINGLE 1318.0
2002-01-01 ASTARTS MULTI 311.0
2002-01-01 UNDERCONST TOTAL 996.0
2002-01-01 UNDERCONST SINGLE 669.0
2002-01-01 UNDERCONST MULTI 297.0
2002-01-01 ACOMPLETIONS TOTAL 1632.0
2002-01-01 ACOMPLETIONS SINGLE 1324.0
2002-01-01 ACOMPLETIONS MULTI 273.0
2002-02-01 APERMITE TOTAL 1787.0
2002-02-01 APERMITE SINGLE 1401.0"""
lines = data.split("\n")
df = pd.DataFrame(np.array( [ re.split(r'\s{2,}', line) for line in lines[1:] ] ),
columns = lines[0].split())
现在我们有了dataframe,第一步是通过连接cat_idx和dt_idx列来创建列名:
df['col_names'] = df["cat_idx"]+ "_" + df["dt_idx"]
我们将删除现在不可用的列:
df = df.loc[:, ["per_idx", "col_names", "val"]]
我们使用pd.pivot获得输出:
df.pivot(index='per_idx', columns='col_names', values='val')
只要用这个:-
newdf=df.pivot_table(index='per_idx',columns=['cat_idx','dt_idx'],values='val').dropna()
然后:-
columns=[]
for x in newdf.columns.to_list():
columns.append('_'.join([list(x)[0],list(x)[1]]))
最后:-
newdf.columns=columns
现在,如果您要打印
newdf
,那么您将获得所需的输出谢谢。这就是我一直在寻找的东西,它成功了。这也很有帮助,谢谢。我更喜欢上面的解决方案,因为我会将它用于各种不同外观的数据帧。非常感谢!
newdf.columns=columns