在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/Python/ pandas如何按照別名alias進行分組合并

pandas如何按照別名alias進行分組合并

1、條件:
根據(jù)兩行中的alias是否有交集,如果有交集,則以#號相隔進行合并
其中:alias中以#號分隔別名
2、數(shù)據(jù)
name alias
0 土豆 地豆#地蛋#馬鈴薯#土豆
1 馬鈴薯 薯仔#馬鈴薯
2 玉米 棒子#包谷#玉米#玉米
3 薯仔 薯仔
4 包谷 包谷#玉米

clipboard.png

3、最終結(jié)果
name alias
土豆#馬鈴薯#薯仔 地豆#地蛋#馬鈴薯#土豆#薯仔
玉米#包谷 棒子#包谷#玉米#玉米
clipboard.png

即第1、2、4合并,3、5合并(以#號合并,并去重復)

cols = ['name', 'alias']
data = [['土豆',‘地豆#地蛋#馬鈴薯#土豆’],
['馬鈴薯', '薯仔#馬鈴薯'],
['玉米', '棒子#包谷#玉米#玉米'],
['薯仔', '薯仔'],
['包谷', '包谷#玉米']]
frame = pd.DataFrame(data,columns=cols)

回答
編輯回答
毀了心
import pandas as pd
cols = ['name', 'alias']
data = [['土豆','地豆#地蛋#馬鈴薯#土豆'],
['馬鈴薯', '薯仔#馬鈴薯'],
['玉米', '棒子#包谷#玉米#玉米'],
['薯仔', '薯仔'],
['包谷', '包谷#玉米']]
frame = pd.DataFrame(data,columns=cols)

d=frame.set_index('name').to_dict()['alias'] # 轉(zhuǎn)成dict處理
k,v = [], []
for i in d:
    print(k, v)
    sv = set(d[i].split('#'))
    cf, cfi = False, None # 重復標志
    for j in range(len(v)):
        if i in v[j]:
            k[j].add(i)
            v[j].update(sv)
            cf, cfi = True, j
            break
    if cf:
        remove = []
        for j in range(len(v)):
            if j != cfi and k[j] & v[cfi]:
                remove.insert(0, j)
                k[cfi].update(k[j])
                v[cfi].update(v[j])
        for j in remove:
            k.pop(j)
            v.pop(j)
    else:
        k.append(set([i]))
        v.append(sv)

frame = pd.DataFrame({'name':['#'.join(i) for i in k], 'alias':['#'.join(i) for i in v]})
print(frame)
             alias       name
0         包谷#棒子#玉米      包谷#玉米
1  薯仔#馬鈴薯#地蛋#土豆#地豆  薯仔#土豆#馬鈴薯
2018年9月20日 15:47
編輯回答
爛人
import pandas as pd
import operator
from collections import Counter

cols = ['name', 'alias']
data = [
    ['土豆', '地豆#地蛋#馬鈴薯#土豆'],
    ['馬鈴薯', '薯仔#馬鈴薯'],
    ['玉米', '棒子#包谷#玉米#玉米'],
    ['薯仔', '薯仔'],
    ['包谷', '包谷#玉米']
]

df = pd.DataFrame(data, columns=cols)

#統(tǒng)計重復出現(xiàn)的值列表
inter_lst = reduce(operator.add, df['alias'].apply(lambda x: x.split('#')))
for k, v in Counter(inter_lst).iteritems():
    if v == 1:
        continue

    #找出包含重復值的行并刪除
    df1 = df[df['alias'].str.contains(k)]
    df = df.drop(df1.index)

    #構(gòu)建新行
    name_lst = reduce(operator.add, df1['name'].apply(lambda x: x.split('#')))
    alias_lst = reduce(operator.add, df1['alias'].apply(lambda x: x.split('#')))

    name = '#'.join(list(set(name_lst)))
    alias = '#'.join(list(set(alias_lst)))

    #添加新行
    df = df.append(pd.Series(dict(name=name, alias=alias)), ignore_index=True)

print df
2017年9月7日 02:09