![](/img/trans.png)
[英]Transpose row values into existing predefined columns in pandas dataframe
[英]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.