将行值转置到 Pandas 中的特定列

Transpose row values into specific columns in Pandas

我有一个这样的 df:

    MemberID FirstName LastName ClaimID  Amount    
0   1          John      Doe     001A    100
1   1          John      Doe     001B    150
2   2          Andy      Right   004C    170
3   2          Andy      Right   005A    200
4   2          Andy      Right   002B    100   

我需要将每个成员的 'ClaimID' 列中的值转置到一行中,这样每个成员都会将每个 Claim 作为一个单独的列中的值,称为 'Claim(1-MaxNumofClaims),并且同样的逻辑也适用于 Amount 列,输出需要如下所示:

    MemberID FirstName LastName  Claim1 Claim2  Claim3 Amount1 Amount2 Amount3     
0   1          John      Doe     001A   001B    NaN    100     150     NaN
1   2          Andy      Right   004C   005A    002B   170     200     100    

我是 Pandas 的新手,遇到了这个问题,如有任何帮助,我们将不胜感激。

  • 你需要的操作不是转置,这个交换行和列索引
  • 这种方法 groupby() 识别列并构造 dict 您希望值成为列 1..n
  • 的列
  • 第二部分是展开这些 dictpd.Series 将一系列 dict 扩展到列
df = pd.read_csv(io.StringIO("""    MemberID FirstName LastName ClaimID  Amount    
0   1          John      Doe     001A    100
1   1          John      Doe     001B    150
2   2          Andy      Right   004C    170
3   2          Andy      Right   005A    200
4   2          Andy      Right   002B    100   """), sep="\s+")

cols = ["ClaimID","Amount"]

# aggregate to columns that define rows,  generate a dict for other columns
df = df.groupby(
    ["MemberID","FirstName","LastName"], as_index=False).agg(
    {c:lambda s: {f"{s.name}{i+1}":v for i,v in enumerate(s)} for c in cols})

# expand out the dicts and drop the now redundant columns
df = df.join(df["ClaimID"].apply(pd.Series)).join(df["Amount"].apply(pd.Series)).drop(columns=cols)

MemberID FirstName LastName ClaimID1 ClaimID2 ClaimID3 Amount1 Amount2 Amount3
0 1 John Doe 001A 001B nan 100 150 nan
1 2 Andy Right 004C 005A 002B 170 200 100