Pandas:从多线观测到单线观测

2024-06-16 14:15:16 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这个数据帧:

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\ u table、stack/unstack和melt,但我要么以巨大的维度结束,要么数据丢失。你知道吗


Tags: addindexvarbbbcccaaacabvals
3条回答

通过groupby.apply的一种方法:

df.groupby('index')['var_vals'].apply(lambda x: pd.Series(x.unique())).unstack()

         0    1
index          
10a    aaa  abb
20b    bbb  bba
30c    ccc  cab

还有一个:

newdf = pd.DataFrame(df.groupby('index')['var_vals'].unique().tolist()).fillna('')
  1. tolist()将数据传回列表格式,这使我们能够重新创建数据帧,并将其再次传递给pd.数据帧()
  2. 菲娜处理的事实是,你可以有不同数量的unique。你知道吗

更新代码:

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)

完整示例

作为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

pivot一起使用drop_duplicates

df.drop_duplicates().assign(key=lambda x : x.groupby('index').cumcount()).pivot('index','key','var_vals')
Out[910]: 
key      0    1
index          
10a    aaa  abb
20b    bbb  bba
30c    ccc  cab

相关问题 更多 >