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