从两个数据帧在Python中创建和操作网络

2024-03-29 14:45:55 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在努力解决一个编程问题,这个问题描述如下。我有一个第一个数据帧,它将客户链接到参考号。你知道吗

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'cus_id' : ['WAT_281', 'NIV_654', 'HUL_602', 'BRA_451'], 
                    'ref_num' : ['1410', '1410', '2960', '5050']})

print(df1)

    cus_id ref_num
0  WAT_281    1410
1  NIV_654    1410
2  HUL_602    2960
3  BRA_451    5050

如您所见,每个客户都链接到一个参考号。此外,不同的客户可以链接到同一号码(例如,客户WAT_281NIV_654链接到参考号码1410)。你知道吗

接下来,我有第二个数据帧,其中每一行描述两个客户之间的链接。你知道吗

df2 = pd.DataFrame({'left_cus_id' : ['NOR_150', 'HUL_602', 'BAS_872', 'THI_028', 'PLA_467', 'ANT_360'], 
                    'right_cus_id' : ['NIV_654', 'THI_028', 'THI_028', 'PLA_467', 'GEN_089', 'KEF_100']})

print(df2)

  left_cus_id right_cus_id
0     NOR_150      NIV_654
1     HUL_602      THI_028
2     BAS_872      THI_028
3     THI_028      PLA_467
4     PLA_467      GEN_089
5     ANT_360      KEF_100

从视觉上看,这两个数据帧创建了一个网络。为了更好地解释这一点,我在一个特定的子集上创建了一个图表。你知道吗

enter image description here

我的目标以红色突出显示。具体来说,我想“重组”我原来的网络,以创建一个新的数据框架之间的联系客户和参考号码。我的最终数据帧应该只包括链接到参考号的客户。就我的例子来说,应该是这样的:

    cus_id ref_num
0  WAT_281    1410
1  NIV_654    1410
2  NOR_150    1410
3  HUL_602    2960
4  THI_028    2960
5  BAS_872    2960
6  PLA_467    2960
7  BRA_451    5050

不幸的是,我不知道如何实现我的目标。我也不知道如何从两个初始数据帧创建这个网络。我应该注意到,我的问题还包括以下更复杂的关系。你知道吗

enter image description here

任何帮助我实现目标的人都将不胜感激。我感兴趣的代码,可以解决这个问题,并在这个过程中所涉及的步骤的描述。你知道吗


Tags: 数据refid客户链接num号码pd
1条回答
网友
1楼 · 发布于 2024-03-29 14:45:55

这是我开发的简单解决方案。刚刚用df1的id映射了df2的列。你知道吗

df1 = pd.DataFrame({'cus_id' : ['WAT_281', 'NIV_654', 'HUL_602', 'BRA_451'],
                    'ref_num' : ['1410', '1410', '2960', '5050']})

df2 = pd.DataFrame({'left_cus_id' : ['NOR_150', 'HUL_602', 'BAS_872', 'THI_028', 'PLA_467', 'ANT_360'],
                    'right_cus_id' : ['NIV_654', 'THI_028', 'THI_028', 'PLA_467', 'GEN_089', 'KEF_100']})

df2['right_ref_num'] = df2['left_cus_id'].map(df1.set_index('cus_id')['ref_num'])

df2['left_ref_num'] = df2['right_cus_id'].map(df1.set_index('cus_id')['ref_num'])

df1 = df1.append(
    df2[['left_cus_id', 'left_ref_num']]
    .rename(columns={'left_cus_id': 'cus_id',
                     'left_ref_num': 'ref_num'})
    .dropna())
df1 = df1.append(
    df2[['right_cus_id', 'right_ref_num']]
    .rename(columns={'right_cus_id': 'cus_id',
                     'right_ref_num': 'ref_num'})
    .dropna())


print(df1.sort_values(by='ref_num').reset_index(drop=True))

结果:

    cus_id ref_num
0  WAT_281    1410
1  NIV_654    1410
2  NOR_150    1410
3  HUL_602    2960
4  THI_028    2960
5  BRA_451    5050

相关问题 更多 >