从具有相同 ID 的行创建列

Posted

技术标签:

【中文标题】从具有相同 ID 的行创建列【英文标题】:Create columns from row with same ID 【发布时间】:2019-02-21 08:00:38 【问题描述】:

我有一个这样的 df:

Id      username  age

1       michael.     34
6.      Mike.          65
7.      Stephanie.  14
1.      Mikael.        34
6.      Mick.           65

如您所见,对于相同的 id,用户名的写法不同。我想像这样将所有用户名重新组合到同一行:

Id      username      username_2    Age

1       michael.         mikael.           34
6.      Mike.             Mick.              65
7.      Stephanie.                           14

谢谢。

【问题讨论】:

【参考方案1】:

您可以创建MultiIndex 用于cumcount 重复的计数Id,然后可以通过unstack 重塑,最后通过add_prefixreset_index 进行一些数据清理:

df1 = (df.set_index(['Id', df.groupby('Id').cumcount()])['username']
         .unstack(fill_value='')
         .add_prefix('username_')
         .reset_index())
print (df1)
    Id username_0 username_1
0  1.0    michael     Mikael
1  6.0       Mike       Mick
2  7.0  Stephanie           

或从1 开始的rename 列:

df1 = (df.set_index(['Id', df.groupby('Id').cumcount()])['username']
         .unstack(fill_value='')
         .rename(columns = lambda x: f'username_x+1')
         .reset_index())
print (df1)
    Id username_1 username_2
0  1.0    michael     Mikael
1  6.0       Mike       Mick
2  7.0  Stephanie        

【讨论】:

工作正常!如果不删除我的 df 的所有其他行,你现在是怎么做到这一点的? @YoavTaieb - S 有多个列,例如username,并且需要在输出数据中对它们进行相同的处理,例如列username 是的,但我也想保留我以前的数据来自我的 df。你看我有其他列不需要这个处理,我想保留它们。 @YoavTaieb - 你能用预期的输出改变有问题的数据吗? @YoavTaieb - 所以将df.set_index(['Id', df.groupby('Id').cumcount()])['username'] 更改为df.set_index(['Id','age', df.groupby('Id').cumcount()])['username'],但每一行需要与数据样本中相同的值。

以上是关于从具有相同 ID 的行创建列的主要内容,如果未能解决你的问题,请参考以下文章

Arrayformula - 从具有相同键 ID 的行中收集所有文本

获取具有 stdClass 对象列的行并求和具有相同 id 的元素

SQL 聚合具有相同 id 的行,辅助列中的特定值

Pyspark 从具有不同列的行/数据创建 DataFrame

从 BigQuery 中删除重复记录

如何删除R中两列中具有相同值但ID不同的行[重复]