我想循环两个数据框的低谷名称,找到具有相同列名的列,并将它们组合以创建新的数据框。
我试图在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})
非常感谢您的帮助!
答案 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})