簡體   English   中英

比較兩個熊貓數據框與列中的列表

[英]comparing two pandas dataframes with list in column

我有兩個數據幀df1和df2:

df1 : 
Name A_list
abcd (apple,orange,banana)
bcde (orange,mango)
cdef (apple,pineapple)

df2 :
City B_list
C1   (apple,mango,banana)
C2   (mango)
C3   (pineapple,banana)

我想制作一個新的數據框df3

Name A_list City
abcd (apple,orange,banana) (C1,C3)
bcde (orange,mango) (C1,C2)
cdef (apple,pineapple) (C1,C3)

例如,通過Df1中的A_list並標識每個水果來自的城市。 我不確定如何使用列表A_list和B_list合並df1和df2

設定

df1 = pd.DataFrame([
        ['abcd', ('apple', 'orange', 'banana')],
        ['bcde', ('orange', 'mango')],
        ['cdef', ('apple', 'pineapple')]
    ], columns=['Name', 'A_list'])
df2 = pd.DataFrame([
        ['C1', ('apple', 'mango', 'banana')],
        ['C2', ('mango')],
        ['C3', ('pineapple', 'banana')]
    ], columns=['City', 'B_list'])

按摩數據

s2 = df2.set_index('City').squeeze() \
    .apply(pd.Series) \
    .stack().reset_index(1, drop=True)

s2

City
C1        apple
C1        mango
C1       banana
C2        mango
C3    pineapple
C3       banana
dtype: object

s1 = df1.set_index('Name').squeeze() \
    .apply(pd.Series) \
    .stack().reset_index(1, drop=True)

s1

Name
abcd        apple
abcd       orange
abcd       banana
bcde       orange
bcde        mango
cdef        apple
cdef    pineapple
dtype: object

df3 = pd.merge(*[s.rename('fruit').reset_index() for s in [s1, s2]])

df3

在此處輸入圖片說明

def tuplify(series):
    return tuple(set(series))

df3.groupby('Name') \
    .apply(lambda df: df.drop('Name', axis=1).apply(tuplify)) \
    .rename(columns=dict(fruit='A_list')).reset_index()

在此處輸入圖片說明

請注意,缺少'orange' ,因為它不是由'City' 如果您想要相同的A_list

df3 = pd.merge(*[s.rename('fruit').reset_index() for s in [s1, s2]])
df3 = df3.groupby('Name') \
    .apply(lambda df: df.drop('Name', axis=1).apply(tuplify)) \
    .rename(columns=dict(fruit='A_list'))

df3['A_list'] = df1.set_index('Name')['A_list']
df3.reset_index()

在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM