繁体   English   中英

将行值转置为 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(1-MaxNumofClaims)”的单独列中的值,并且相同的逻辑适用于 Amount列,output 需要如下所示:

    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()识别列并构造您希望值成为列 1..n 的列的dict
  • 第二部分是扩展这些dict pd.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)

会员ID 索赔ID1 索赔ID2 索赔ID3 金额1 金额2 金额3
0 1 约翰 能源部 001A 001B 100 150
1 2 安迪 正确的 004C 005A 002B 170 200 100

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM