python – Pandas中的分层数据 – 在共享相同“父”值的所有“子”值中复制数据

我正试图找出一种方法来将数据,在这种情况下,用户信息(’email_address’,’name’)传递给共享同一母公司的所有子公司(‘companyID’)(‘parent_companyID’) .

我的示例DataFrame是:

In [1]: sample_data = pd.DataFrame(
{'companyID': {0: 112, 1: 223, 2: 434, 3: 777, 4: 790},
 'email_address': {0: '112email@gmail.com',  1: '', 2: '434email@gmail.com', 3: '777email@gmail.com', 4: ''},
 'name': {0: 'Joe', 1: '', 2: '', 3: '', 4: 'George'},
 'parent_companyID': {0: 555, 1: 555, 2: 555, 3: 999, 4: 999}}
)

或者为了更好的可读性:

    companyID   email_address        name    parent_companyID
0   112         112email@gmail.com   Joe         555
1   223                                          555
2   434         434email@gmail.com               555
3   777         777email@gmail.com               999
4   790                              George      999

我做了很多搜索,似乎找不到能帮我解决这个问题的类似问题.我通过MultiIndex采取了很多尝试,但没有达到预期的结果,这是:

    companyID   email_address        name    parent_companyID
0   112         112email@gmail.com   Joe         555
1   112                                          555
2   112         434email@gmail.com               555
3   223         112email@gmail.com   Joe         555
4   223                                          555
5   223         434email@gmail.com               555
6   434         112email@gmail.com   Joe         555
7   434                                          555    
8   434         434email@gmail.com               555
9   777         777email@gmail.com               999
10  777                              George      999
11  790         777email@gmail.com               999
12  790                              George      999

我希望避免通过一些可怕的循环来完成这个结果,尽管这是我能想到解决这个问题的唯一方法.该过程将应用于数十万行的数据集,但不会经常运行,因此效率是一个考虑但不是硬性要求.如果涉及到它,我将走循循环线,但我认为必须有更好的方法.任何帮助,即使它只是指向我正确的方向,将不胜感激!我已经把头发拉了好几天……

最佳答案 自我融合!

> pd.merge一个人的自我,向内看
>方便地为合并的左半部分添加后缀
>我希望除了’companyID’之外的所有东西都来自合并的右半部分所以我把它的后缀留作了一个空字符串
>我只想要左半边的’companyID’…注意我将后缀”设为单个空格.我这样做,以便我稍后重命名将使用一个简单的str.strip
>重新排列我的列,我在其中切片最终结果以获得我想要的顺序.

on = 'parent_companyID'
mrg = sample_data.merge(sample_data, on=on, suffixes=[' ', ''])
cols = sample_data.columns.tolist()
cols.remove('companyID')
cols.insert(0, 'companyID ')
mrg[cols].rename(columns=str.strip)

    companyID       email_address     name  parent_companyID
0         112  112email@gmail.com  112Name               555
1         112                                            555
2         112  434email@gmail.com                        555
3         223  112email@gmail.com  112Name               555
4         223                                            555
5         223  434email@gmail.com                        555
6         434  112email@gmail.com  112Name               555
7         434                                            555
8         434  434email@gmail.com                        555
9         777  777email@gmail.com                        999
10        777                      790Name               999
11        790  777email@gmail.com                        999
12        790                      790Name               999
点赞