我的df
结构如下:
name date A B C
n1 07/01 a b c
n1 06/01 aa bb cc
n1 05/01 aaa bbb ccc
...
我需要构建数据框,使其看起来像:
name letters 05/01 06/01 07/01
n1 A aaa aa a
n1 B bbb bb b
n1 C ccc cc c
...
我可以使用melt()
中的pandas
将所有列拉到新行:
import pandas as pd
pd.melt(df, id_vars=["name"], var_name = "letters")
哪个收益率:
name letters value
n1 date 05/01
n1 date 06/01
n1 date 07/01
n1 A aaa
n1 A aa
n1 A a
n1 B bbb
n1 B bb
n1 B b
n1 C ccc
n1 C cc
n1 C c
...
现在我如何通过“日期”将其转出来获得我想要的结构?
我不确定如何在“字母”列中的“日期”行中应用df.pivot()
。有任何建议或替代步骤吗?
答案 0 :(得分:1)
试试这个:
df1 = df.drop('name', 1).set_index('date').rename_axis('letters', 1).sort_index(1, ascending=1).T.reset_index()
df1.set_index(pd.Index(['n1'] * len(df1), name='name')).reset_index().rename_axis(None, 1)
答案 1 :(得分:0)
我想保留我的另一个答案,但我认为这是一个更好的答案。
tpose = lambda df: df.drop('name', 1).set_index('date').T
df.groupby('name', as_index=True).apply(tpose)
我们需要进行调整才能达到您可能想要的最终格式,但我认为这样做更加丑陋。
调整
tpose = lambda df: df.drop('name', 1).set_index('date').T
df1 = df.groupby('name', as_index=True).apply(tpose)
df1.rename_axis(['name', 'letters']).reset_index().rename_axis(None, 1)
这完全适用于您拥有的任何长度数据集以及'name'
答案 2 :(得分:0)
试试这个:
pd.concat([df[["name"]],df.iloc[:,1:].set_index("date").T.reset_index()],axis= 1 ).rename(columns = {'index':'letter'})
name letter 07/01 06/01 05/01
0 n1 A a aa aaa
1 n1 B b bb bbb
2 n1 C c cc ccc