gpt4 book ai didi

python - Pandas Groupby/列表到多行

转载 作者:行者123 更新时间:2023-12-04 14:30:46 25 4
gpt4 key购买 nike

在这个例子中,我每行总共有 7 列。我按 AccountID 和 Last Name 分组。按 AccountID 和 Last Name 分组标识同一个人; Contract、Address、City 和 State 的不同行值表示 AccountID/Last Name 的新位置。
我希望将 AccountID/Last Name 与一组或多组契约(Contract)、地址、城市和州放在一行上。
当前数据如下所示:


契约(Contract)
帐户ID


地址
城市
状态


622
1234
皮特
布拉德
7 大街 466 号
公园坡
纽约

28974
1234
皮特
布拉德
1901 藤街
费城
公共(public)广播

54122
4321
福特
亨利
93展位博士
纳特利
新泽西州

622
2345
罗德
尘土飞扬
1 公共(public)图书馆广场
斯坦福
计算机断层扫描

28974
2345
罗德
尘土飞扬
1001国王公路
樱桃山
新泽西州

54122
2345
罗德
尘土飞扬
阿姆斯特丹大街444号
上西区
纽约


想显示这样的数据:


帐户ID


契约(Contract).1
地址1
城市_1
状态_1
契约(Contract)_2
地址2
城市_2
状态_2
契约(Contract)_3
地址_3
城市_3
状态_3


1234
皮特
布拉德
622
7 大街 466 号
公园坡
纽约
28974.0
1901 藤街
费城
公共(public)广播



4321
福特
亨利
54122
93展位博士
纳特利
新泽西州





2345
罗德
尘土飞扬
622
1 公共(public)图书馆广场
斯坦福
计算机断层扫描
28974.0
1001国王公路
樱桃山
新泽西州
54122.0
阿姆斯特丹大街444号
上西区
纽约


这是我到目前为止所做的。第 5 步及以上我已经重新工作了一个星期。有什么建议?

# Step 1
import pandas as pd
import numpy as np
# read from "my clipboard"
df = pd.read_clipboard()
df

#Step 2
df['Contract_State'] = (df['Contract'].astype(str) + '|' + df['Address'] + '|' + df['City'] + '|' + df['State']).str.split()
df['Contract'] = df['Contract'].astype(str)
df['AccountID'] = df['AccountID'].astype(str)

# Step 3 - groupby
df2 = pd.DataFrame(df.groupby(['AccountID', 'Last Name']).Contract_State.apply(list)).reset_index()
df2

# Step 4 - flatten the lists
df2['Contract_State'] = df2['Contract_State'].apply(lambda x: np.array(x).flatten())
df2

# Step 5 - The number of elements in lists each list is always even => /2
num_columns = df2['Contract_State'].apply(len).max()
num_columns

# Step 6
df3 = pd.DataFrame(list(df2['Contract_State']), columns=columns)
df3

# Step 7 - concatenate df2 with contracts, then drop the column "Contract_State"
df4 = pd.concat([df2, df3], join='inner', axis='columns').drop('Contract_State', axis='columns')
df4

最佳答案

IIUC,我认为你可以这样做:

dfg = df.groupby(['AccountID', 'Last Name', df.groupby(['AccountID', 'Last Name']).cumcount() + 1]).first().unstack()
dfg.columns = [f'{i}{j}' for i, j in dfg.columns]
df_out = dfg.sort_index(axis=1, key=lambda x: x.str[-1])
df_out.reset_index()
输出:
   AccountID Last Name  Contract1 First Name1                Address1       City1 State1  Contract2 First Name2            Address2         City2 State2  Contract3 First Name3            Address3            City3 State3
0 1234 Pitt 622.0 Brad 466 7th Ave Park Slope NY 28974.0 Brad 1901 Vine Street Philadelphia PA NaN NaN NaN NaN NaN
1 2345 Rhodes 622.0 Dusty 1 Public Library Plaze Stamford CT 28974.0 Dusty 1001 Kings Highway Cherry Hill NJ 54122.0 Dusty 444 Amsterdamn Ave Upper West Side NY
2 4321 Ford 54122.0 Henry 93 Booth Dr Nutley NJ NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

关于python - Pandas Groupby/列表到多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69089182/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com