簡體   English   中英

如何根據熊貓中的不同條件和列將2個數據框分組

[英]How to group 2 dataframes based on different conditions and columns in pandas

我在下面的示例中有一個數據框 數據框1

數據框2

我想要實現的是結合基於ColA的2個數據幀,並且ColC中的值也應在各列之間匹配(即檢查列表中是否存在該值)。 您能否提出一種有效且簡單的方法來解決此問題? 我知道可以通過遍歷數據幀1的行並比較值來以正常方式完成此操作。 但是我覺得應該有其他好的方法(熊貓方法)來解決這個問題。

先感謝您

我將在這里使用嵌套

df1['ListCol']=df1['ColC']# Here I am try to record the original data 
Yourdf=unnesting(df1,['ColC']).merge(df2, on=['ColA','ColC'],how='inner')
Yourdf
   ColC ColA  ColB    ListCol
0     2    A     1  [1, 2, 3]
1     3    A     1  [1, 2, 3]
2     6    A     2  [4, 5, 6]
3     2    B     4  [1, 2, 3]
4     5    B     5  [3, 4, 5]

def unnesting(df, explode):
    idx = df.index.repeat(df[explode[0]].str.len())
    df1 = pd.concat([
        pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
    df1.index = idx

    return df1.join(df.drop(explode, 1), how='left')

您可以這樣進行,在數據幀一df1中擴展ColC,然后將ColA上的合並和df1中的“ melted”列融為一列:

df1 = pd.DataFrame({'ColA':[*'AABBB'], 
                    'ColB':[1,2,3,4,5], 
                    'ColC':[[1,2,3],[4,5,6],[7,8,9],[1,2,3],[3,4,5]]})

df2 = pd.DataFrame({'ColA':[*'AAABB'], 'ColC':[3,6,2,2,5]})

df1_m = df1.assign(**pd.DataFrame([i for i in df1['ColC'].values]).add_prefix('ColC_'))\
           .melt(['ColA','ColB','ColC'])

df_out = df2.merge(df1_m, left_on=['ColA','ColC'], right_on=['ColA','value'])
df_out

輸出:

  ColA  ColC_x  ColB     ColC_y variable  value
0    A       3     1  [1, 2, 3]   ColC_2      3
1    A       6     2  [4, 5, 6]   ColC_2      6
2    A       2     1  [1, 2, 3]   ColC_1      2
3    B       2     4  [1, 2, 3]   ColC_1      2
4    B       5     5  [3, 4, 5]   ColC_2      5

另一種方法是使用mergeColAapply與蟒蛇in運營商只挑行,其中ColC_yColC_x

In [19]: df1
Out[19]:
  ColA  ColB       ColC
0    A     1  [1, 2, 3]
1    A     2  [4, 5, 6]
2    B     3  [7, 8, 9]
3    B     4  [1, 2, 3]
4    B     5  [3, 4, 5]

In [20]: df2
Out[20]:
  ColA  ColC
0    A     3
1    A     6
2    A     2
3    B     2
4    B     5

In [21]: df3 = df1.merge(df2, on=['ColA'])

In [22]: df3
Out[22]:
   ColA  ColB     ColC_x  ColC_y
0     A     1  [1, 2, 3]       3
1     A     1  [1, 2, 3]       6
2     A     1  [1, 2, 3]       2
3     A     2  [4, 5, 6]       3
4     A     2  [4, 5, 6]       6
5     A     2  [4, 5, 6]       2
6     B     3  [7, 8, 9]       2
7     B     3  [7, 8, 9]       5
8     B     4  [1, 2, 3]       2
9     B     4  [1, 2, 3]       5
10    B     5  [3, 4, 5]       2
11    B     5  [3, 4, 5]       5

In [23]: df3[df3.apply(lambda x: x['ColC_y'] in x['ColC_x'], axis=1)]
Out[23]:
   ColA  ColB     ColC_x  ColC_y
0     A     1  [1, 2, 3]       3
2     A     1  [1, 2, 3]       2
4     A     2  [4, 5, 6]       6
8     B     4  [1, 2, 3]       2
11    B     5  [3, 4, 5]       5

暫無
暫無

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

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