首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何根据另一列中的条件转置一列?

如何根据另一列中的条件转置一列?
EN

Stack Overflow用户
提问于 2019-03-10 14:21:59
回答 3查看 589关注 0票数 1

我肯定以前有人问过这个问题(因为这是一个常见的问题),但我找不到它。

所以我的数据帧看起来是这样的:

代码语言:javascript
复制
ID     Name
1      A
1      B
2      X
2      Y
2      Z

我希望它采用这种格式(我不关心列名)

代码语言:javascript
复制
1    A    B
2    X    Y   Z  and so on...
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-03-10 14:35:02

通过 DataFrame.set_index 使用 GroupBy.cumcount 计数器创建 MultiIndex 并通过 Series.unstack 使用 DataFrame.reset_index 重塑索index

代码语言:javascript
复制
df1 = (df.set_index(['ID',df.groupby('ID').cumcount()])['Name']
         .unstack(fill_value='')
         .reset_index())
print (df1)
   ID  0  1  2
0   1  A  B   
1   2  X  Y  Z

small DataFrame中的性能

代码语言:javascript
复制
np.random.seed(123)
N = 1000
L = list('abcdefghijklmno')
df = pd.DataFrame({'Name': np.random.choice(L, N),
                   'ID':np.random.randint(100, size=N)}).sort_values('ID')
#print (df)

In [15]: %%timeit
    ...: df_new=df.groupby('ID')['Name'].apply(lambda x: ','.join(list(x))).reset_index()
    ...: df_new.join(df_new.pop('Name').str.split(",",expand=True))
    ...: 
22 ms ± 411 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)

In [16]: %%timeit
    ...: df1 = (df.set_index(['ID',df.groupby('ID').cumcount()])['Name']
    ...:          .unstack(fill_value='')
    ...:          .reset_index())
    ...: 
6.05 ms ± 212 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [17]: %%timeit
    ...: df.set_index('ID').groupby('ID').apply(lambda x: x.reset_index(drop=True).T).reset_index(level=1,drop=True)
    ...: 
151 ms ± 1.25 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
票数 3
EN

Stack Overflow用户

发布于 2019-03-10 14:26:23

你可以这样做:

代码语言:javascript
复制
df_new=df.groupby('ID')['Name'].apply(lambda x: ','.join(list(x))).reset_index()
df_new.join(df_new.pop('Name').str.split(",",expand=True))

   ID  0  1     2
0   1  A  B  None
1   2  X  Y     Z
票数 3
EN

Stack Overflow用户

发布于 2019-03-10 15:21:42

你想要的东西可以通过下面的代码来创建。

代码语言:javascript
复制
    data = [[1,'A'] , [1 , 'B'] , [2 , 'X'] , [2 , 'Y'] , [2 , 'Z']]  
    df = pd.DataFrame(data , columns=['ID' , 'Name'])

    id_list = df['ID'][~df['ID'].duplicated()]
    t_rows = []
    max_val_num = 0
    for id_ in id_list:
        row = df[df['ID'] == id_]['Name'].tolist()
        t_rows.append(row)
        if len(row) >= max_val_num:
            max_val_num = len(row)

    df_transform = pd.DataFrame(t_rows , columns=['col_'+str(i) for i in range(max_val_num)])  
    print(df_transform)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55085042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档