Python 如何在pandas数据框中取消单词列的堆叠?

Python 如何在pandas数据框中取消单词列的堆叠?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一个以下格式的数据帧 df=pd.DataFrame( {“公司”:[“麦当劳”、“阿比”、“温迪”], “城市”:[“达拉斯”、“奥斯汀”、“芝加哥”], “日期时间”:[{“11/23/2016”:“1”、“09/06/2011”:“2”}, {"02/23/2012":"1","04/06/2013":"2"}, {"10/23/2017":"1","05/06/2019":"2"}]}) df >>>公司城市日期时间 >>>达拉斯麦当劳{'11/23/2016':'1','09/06

我有一个以下格式的数据帧

df=pd.DataFrame(
{“公司”:[“麦当劳”、“阿比”、“温迪”],
“城市”:[“达拉斯”、“奥斯汀”、“芝加哥”],
“日期时间”:[{“11/23/2016”:“1”、“09/06/2011”:“2”},
{"02/23/2012":"1","04/06/2013":"2"},
{"10/23/2017":"1","05/06/2019":"2"}]})
df
>>>公司城市日期时间
>>>达拉斯麦当劳{'11/23/2016':'1','09/06/2011':'2'}
>>>阿尔比斯奥斯汀{'02/23/2012':'1','04/06/2013':'2'}
>>>温迪芝加哥{'10/23/2017':'1','05/06/2019':'2'}
列“Datetime”中的字典是一个字符串,因此我必须使用ast.literal\u eval将其读入python字典

我希望根据datetime中的值取消数据帧的堆栈,以便输出如下所示:

df\u out
>>>公司城市日期值
>>>麦当劳达拉斯2016年11月23日1
>>>麦当劳达拉斯2011年6月9日2
>>>2012年2月23日阿尔比斯奥斯汀1
>>>2013年6月4日阿尔比斯奥斯汀2
>>>温迪芝加哥2017年10月23日1
>>>温迪芝加哥2019年6月5日2
我对这一点有点迷茫,我知道我需要遍历每一行并阅读每一本字典,所以我想到了使用
df.iterrows()
并创建每一行的命名倍数值,这些值不会改变,然后在字典本身上循环附加不同的日期时间值,但我不确定这是最有效的方法。任何提示都将不胜感激。

我的尝试:

(df.drop('Datetime', axis=1)
  .merge(df.Datetime.agg(lambda x: pd.Series(x))
           .stack().reset_index(-1),
         left_index=True, 
         right_index=True
        )
   .rename(columns={'level_1':'Date', 0:'Value'})
)
输出:

     company     City        Date Value
0  McDonalds   Dallas  11/23/2016     1
0  McDonalds   Dallas  09/06/2011     2
1      Arbys   Austin  02/23/2012     1
1      Arbys   Austin  04/06/2013     2
2     Wendys  Chicago  10/23/2017     1
2     Wendys  Chicago  05/06/2019     2

我会将
Datetime
中的字典展平,并从中构建一个新的
df
。最后,加入我们

from itertools import chain
df1 = pd.DataFrame(chain.from_iterable(df.Datetime.map(dict.items)), 
                   index=df.index.repeat(df.Datetime.str.len()), 
                   columns=['Date', 'Val'])

Out[551]:
         Date Val
0  11/23/2016   1
0  09/06/2011   2
1  02/23/2012   1
1  04/06/2013   2
2  10/23/2017   1
2  05/06/2019   2

df_final = df.drop('Datetime', 1).join(df1)

Out[554]:
     company     City        Date Val
0  McDonalds   Dallas  11/23/2016   1
0  McDonalds   Dallas  09/06/2011   2
1      Arbys   Austin  02/23/2012   1
1      Arbys   Austin  04/06/2013   2
2     Wendys  Chicago  10/23/2017   1
2     Wendys  Chicago  05/06/2019   2

以下是一个干净的解决方案:

解决方案

df = df.set_index(['company', 'City'])
df_stack = (df['Datetime'].apply(pd.Series)
            .stack().reset_index()
           .rename(columns= {'level_2': 'Datetime', 0: 'val'}))
输出

print(df_stack.to_string())

     company     City    Datetime val
0  McDonalds   Dallas  11/23/2016   1
1  McDonalds   Dallas  09/06/2011   2
2      Arbys   Austin  02/23/2012   1
3      Arbys   Austin  04/06/2013   2
4     Wendys  Chicago  10/23/2017   1
5     Wendys  Chicago  05/06/2019   2