假设我有这个数据框:
df = pd.DataFrame({'index':['10a','10a','10a','20b','20b','20b','30c','30c','30c']
,'var_vals': ['aaa','aaa','abb','bbb','bba','bbb','ccc','ccc','cab']
,'var2_vals':['aga','aga','add','bgb','bbd','bgb','cdd','cdd','cda']})
display(df)
看起来像这样:
index var_vals var2_vals
0 10a aaa aga
1 10a aaa aga
2 10a abb add
3 20b bbb bgb
4 20b bba bbd
5 20b bbb bgb
6 30c ccc cdd
7 30c ccc cdd
8 30c cab cda
如何将输出变成单行,只有新列中的不同之处:
index var_vals var_vals_0 var2_vals var2_vals_0
0 10a aaa abb aga add
1 20b bbb bba bgb bbd
2 30c ccc cab cdd cda
我已经尝试过 groupby、pivot/pivot_table、stack/unstack 和 melt,但我要么以巨大的维度结束,要么数据丢失。
请您参考如下方法:
还有一个:
newdf = pd.DataFrame(df.groupby('index')['var_vals'].unique().tolist()).fillna('')
- tolist() 将数据传回列表格式,这使我们能够重新创建数据帧,再次将其传递给 pd.DataFrame()
- fillna 处理您可以拥有不同数量的唯一身份的事实。
更新代码:
dfs = (pd.DataFrame(df.groupby('index')[i].unique().tolist()).fillna('').add_prefix(i+'_')
for i in df.drop('index', 1))
df = pd.concat(dfs, axis=1)
完整示例
将 pandas 导入为 pd
df = pd.DataFrame({'index':['10a','10a','10a','20b','20b','20b','30c','30c','30c']
,'var_vals': ['aaa','aaa','abb','bbb','bba','bbb','ccc','ccc','cab']
,'var2_vals':['aga','aga','add','bgb','bbd','bgb','cdd','cdd','cda']})
df = pd.concat(
(pd.DataFrame(df.groupby('index')[i].unique().tolist()).fillna('').add_prefix(i+'_')
for i in df.drop('index', 1)), axis=1)
print(df)
返回:
var2_vals_0 var2_vals_1 var_vals_0 var_vals_1
0 aga add aaa abb
1 bgb bbd bbb bba
2 cdd cda ccc cab
