将行值转置到 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 的列
- 第二部分是展开这些
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)
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
我有一个这样的 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 的列
- 第二部分是展开这些
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)
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 |