Skip to main content
 首页 » 编程设计

python之Pandas:从多线观察到单线观察

2025年05月04日8jackei

假设我有这个数据框:

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('') 
  1. tolist() 将数据传回列表格式,这使我们能够重新创建数据帧,再次将其传递给 pd.DataFrame()
  2. 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