Python 在创建新的组合列名时将多个datetimeIndex组合到一行中

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

我有一个类似这样的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  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