我正试图找出一种方法来将数据,在这种情况下,用户信息(’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