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

我有一个包含数百列作为客户端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 = df2

def 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

如果有人对如何解决这个问题有任何建议,我会很高兴


缥缈止盈
浏览 90回答 3
3回答

三国纷争

首先,我们需要熔化 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_tickets3   4char                4            NaN1   3char                5           40.00   2char               30          122.02   17char             100           13.04   16char               9            NaN

慕丝7291255

merge是键,但您必须首先转置初始数据帧,并进行一些修饰性更改,例如重置其索引并提供相关的列名称:转换可以是:df1.rename({0: 'total_tickets'}).T.rename_axis('client_id').reset_index()给:   client_index  total_tickets0            30            1221             5             402           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_tickets0      4char          4            NaN1      3char          5           40.02      2char         30          122.03     16char          9            NaN4     17char        100           13.0

慕斯709654

您可以使用 .pd.mergedf = pd.merge(df1, df2, on="client_id", how='outer')
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python