2017-09-09 70 views
0

我有一些字典是這樣的:Python的熊貓加字典的信息數據幀

d1 = {'a':['v1','v2'],'b':['v2','v3']} 
d2 = {'a':['v4','v5'],'b':['v4','v6']} 

和數據幀df這樣的:

id x 
    v1 Nan 
    v2 Nan 
    v3 Nan 
    v4 Nan 
    v5 Nan 
    v6 Nan 

和另一數據幀another_df這樣的:

id name 
a love 
b hate 

我需要這個結果:

df = 
    id x 
    v1 love 
    v2 love,hate 
    v3 hate 
    v4 love,hate 
    v5 love 
    v6 hate 

我對如何做到這一點的一些想法,比如添加新列,然後用逗號加入他們,但我想我應該妥善不遺餘力這樣 任何想法去做的樂趣,而不讓我頭疼?

如果它只適用於一本字典,我會統一其餘的字典。

+0

請問您可以關閉此問題嗎? https://stackoverflow.com/questions/46064822/return-dataframe-with-range-of-dates –

回答

1

比較.items()只能在python2.x中使用python3.x,您應該使用.iteritems()代替。

d1 = pd.DataFrame([(y_, x) for x, y in d1.items() for y_ in y]) 
d2 = pd.DataFrame([(y_, x) for x, y in d2.items() for y_ in y]) 
d12 = pd.concat([d1, d2]) 

df.merge(d12, left_on='id', right_on=0) \ 
    .merge(another_df, left_on=1, right_on='id')[['id_x', 'name']] \ 
    .groupby('id_x').agg(lambda x: ', '.join(x.values)) \ 
    .reset_index() 

    name 
id_x  
v1 love 
v2 love, hate 
v3 hate 
v4 love, hate 
v5 love 
v6 hate 
+0

只是,由於某種原因,我不得不在第二次合併 –

+1

後添加.drop_duplicates()沒關係,這是我的數據與重複... –

2

這裏是我的解決方案,我打破完成步驟

d1 = {'a':['v1','v2'],'b':['v2','v3']} 
d2 = {'a':['v4','v5'],'b':['v4','v6']} 
anotherdf=anotherdf.set_index('id') 
df=pd.DataFrame([d1,d2]).T 
df=df.unstack().apply(pd.Series).stack().reset_index() 
df['x']=df['level_1'].map(anotherdf['name']) 

選項1 list

df.groupby(0).x.apply(list).reset_index().rename(columns={0:'id'}) 
Out[296]: 
    id    x 
0 v1  [love] 
1 v2 [love, hate] 
2 v3  [hate] 
3 v4 [love, hate] 
4 v5  [love] 
5 v6  [hate] 

選項2 string

df.groupby(0).x.apply(lambda x : ','.join(x)).reset_index().rename(columns={0:'id'}) 
Out[295]: 
    id   x 
0 v1  love 
1 v2 love,hate 
2 v3  hate 
3 v4 love,hate 
4 v5  love 
5 v6  hate