如何在两个数据框中查找相同的列名并组合匹配的列

时间:2019-08-20 21:41:32

标签: python pandas loops

我想循环两个数据框的低谷名称,找到具有相同列名的列,并将它们组合以创建新的数据框。

我试图在for循环中编写if-else条件,但是它不起作用。

具体来说,我有两个这样的数据框:

async

我想要下面的输出-

对于A,输出=

df1 = pd.DataFrame({'A': {'2019Q1': 1, '2019Q2': 2, '2019Q3': 3},
                'B': {'2019Q1': 1, '2019Q2': 3, '2019Q3': 5},
                'C': {'2019Q1': 2, '2019Q2': 4, '2019Q3': 6}})

df2 = pd.DataFrame({'A': {'2019Q1': 4, '2019Q2': 5, '2019Q3': 6},
                'B': {'2019Q1': 1.5, '2019Q2': 3.3, '2019Q3': 5.6},
                'C': {'2019Q1': 2.3, '2019Q2': 4.8, '2019Q3': 6.7}})

对于B,输出=

pd.DataFrame({'df1': {'2019Q1': 1, '2019Q2': 2, '2019Q3': 3},
              'df2': {'2019Q1': 4, '2019Q2': 5, '2019Q3': 6}) 

对于C,输出=

pd.DataFrame({'df1': {'2019Q1': 1, '2019Q2': 3, '2019Q3': 5},
              'df2': {'2019Q1': 1.5, '2019Q2': 3.3, '2019Q3': 5.6}) 

非常感谢您的帮助!

5 个答案:

答案 0 :(得分:5)

这是一种类似于@ALollz的方法,但是将subdf保存在多个索引数据帧中

s = pd.concat([df1, df2], keys=['df1', 'df2']).unstack(0)
s.loc[:,'A']
Out[390]: 
        df1  df2
2019Q1    1    4
2019Q2    2    5
2019Q3    3    6

答案 1 :(得分:3)

concat,用键+ groupby。将结果存储在字典中,以列为键。

d = {idx: gp.droplevel(1, axis=1) for idx, gp in
     pd.concat([df1, df2], keys=['df1', 'df2'], axis=1).groupby(level=1, axis=1)}

d['A']
#        df1  df2
#2019Q1    1    4
#2019Q2    2    5
#2019Q3    3    6

d['B']
#        df1  df2
#2019Q1    1  1.5
#2019Q2    3  3.3
#2019Q3    5  5.6

以上内容将为所有列创建框架,无论是否在两个列中都找到它们。如果没有用,您可以将concat更改为:

cols = df1.columns.union(df2.columns)
pd.concat([df1[cols], df2[cols]], axis=1, keys=['df1', 'df2'])

答案 2 :(得分:0)

由于两个数据帧均按季度索引,因此您可以merge

for col in np.union1d(df1.columns, df2.columns):
    result = df1[[col]].merge(df2[[col]], how='outer', left_index=True, right_index=True)
    result.index.name = col
    result.columns = ['df1', 'df2']
    print(result)

结果:

        df1  df2
A               
2019Q1    1    4
2019Q2    2    5
2019Q3    3    6

        df1  df2
B               
2019Q1    1  1.5
2019Q2    3  3.3
2019Q3    5  5.6

        df1  df2
C               
2019Q1    2  2.3
2019Q2    4  4.8
2019Q3    6  6.7

答案 3 :(得分:0)

您可以使用与您类似的逻辑,方法是:(1)遍历各列,以及(2)如果它们同时存在于df中,则将它们传递给新的数据帧。您可以将结果存储在字典中,其中的关键字是列名:

for col in all_cols:
    if col in df1.columns and col in df2.columns:
        final_df[col] = pd.DataFrame({'df1': df1[col].values, 'df2': df2[col].values})

final_df['A']
    df1     df2
0   1       4
1   2       5
2   3       6

final_df['B']
    df1     df2
0   1       1.5
1   3       3.3
2   5       5.6

final_df['C']
    df1     df2
0   2       2.3
1   4       4.8
2   6       6.7

答案 4 :(得分:0)

for column in df1:
    if column in df2:
        df = pd.DataFrame({"df1": df1[column].values, "df2": df2[column].values})