为了账号安全,请及时绑定邮箱和手机立即绑定

合并两个 pandas 数据帧和公共值,这些值在一个数据帧中显示为列,在另一个数据帧中显示为行

合并两个 pandas 数据帧和公共值,这些值在一个数据帧中显示为列,在另一个数据帧中显示为行

缥缈止盈 2022-08-16 15:39:19
我有一个包含数百列作为客户端ID的数据帧和一行,每个客户端ID的总票证nr,它看起来像这样:(df1是原始csv文件多次转换的结果)df1+-----+----+-----+| 30  | 5  | 100 |+-----+----+-----+| 122 | 40 |  13 |+-----+----+-----+另一个具有 2 列的数据帧,一列account_id,client_id,如下所示:df2+------------+-----------+| account_id | client_id |+------------+-----------+| 4char      | 4         |+------------+-----------+| 3char      | 5         |+------------+-----------+| 2char      | 30        |+------------+-----------+| 16char     | 9         |+------------+-----------+| 17char     | 100       |+------------+-----------+我希望有一个包含3列account_id,client_id和total_tickets的单个文件,如下所示:df+------------+-----------+---------------+| account_id | client_id | total_tickets |+------------+-----------+---------------+| 4char      | 4         | null+------------+-----------+---------------+| 3char      | 5         | 40+------------+-----------+---------------+| 2char      | 30        | 122+------------+-----------+---------------+| 16char     | 9         | null+------------+-----------+---------------+| 17char     | 100       | 13+------------+-----------+---------------+到目前为止,我已经达到了这一点:我已经创建了一个在两个数据帧上迭代()的函数,使用isin()函数检查df2的client_id是否在df1的列中找到,接下来我在df2上添加了一个新列,total_tickets de()函数f1 = df1, f2 = df2def populating_df(f1, f2):    for org_nr in f2.iterrows():        for col in f1.iterrows():           matched_org_nr =  f2.client_id.isin(f1.columns)           if matched_org_nr.any() == True:               sum_of_tickets_per_col = matched_org_nr           # create a new column in f2 file with the values of total_tickets for each org number matched           f2 = f2.loc[:].assign(Total_Tickets=sum_of_tickets_per_col)         return f2如果有人对如何解决这个问题有任何建议,我会很高兴
查看完整描述

3 回答

?
三国纷争

TA贡献1804条经验 获得超7个赞

首先,我们需要熔化 df1,以便对每行都有一个观察值


然后,您可以使用outhero合并到从两列中获取键


df_melt = pd.melt(df1,var_name='client_id',value_name='total_tickets')


df3 = pd.merge(df_melt ,df2,on=['client_id'],how='outer')


#make sure dtypes are the same.


#df_melt ['client_id'] = df_melt ['client_id'].astype(int) 


df3 = df3[["account_id", "client_id", "total_tickets"]].sort_values(

    "account_id", ascending=False

)


print(df3)


     account_id  client_id  total_tickets

3   4char                4            NaN

1   3char                5           40.0

0   2char               30          122.0

2   17char             100           13.0

4   16char               9            NaN


查看完整回答
反对 回复 2022-08-16
?
慕丝7291255

TA贡献1859条经验 获得超6个赞

merge是键,但您必须首先转置初始数据帧,并进行一些修饰性更改,例如重置其索引并提供相关的列名称:


转换可以是:


df1.rename({0: 'total_tickets'}).T.rename_axis('client_id').reset_index()

给:


   client_index  total_tickets

0            30            122

1             5             40

2           100             13

完成此操作后,合并是微不足道的:


result = df2.merge(df1.rename({0: 'total_tickets'}).T.rename_axis('client_id').reset_index(),

                   on='client_id', how='left')

按预期给予:


  account_id  client_id  total_tickets

0      4char          4            NaN

1      3char          5           40.0

2      2char         30          122.0

3     16char          9            NaN

4     17char        100           13.0


查看完整回答
反对 回复 2022-08-16
?
慕斯709654

TA贡献1840条经验 获得超5个赞

您可以使用 .pd.merge

df = pd.merge(df1, df2, on="client_id", how='outer')


查看完整回答
反对 回复 2022-08-16
  • 3 回答
  • 0 关注
  • 89 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信