[英]Merging two dataframes with same column names but different number of columns in pandas
[英]merging two dataframes and reducing the number of columns
我有兩個數據框,df_dates,df_ratios。 兩個數據幀具有相同的尺寸 150 x 4。兩者都有一個作為安全 ID 的列,並且該列在兩個數據幀中是相同的。
df_dates
id col1 col2 col3 col4
1sds nan nan 20200108 nan
bhu6 20190404 nan nan nan
lm55 nan nan 20200623 20201215
bn34 nan nan nan nan
df_ratios
id col1 col2 col3 col4
1sds nan nan 1.34 nan
bhu6 2.6 nan nan nan
lm55 nan nan 0.23 0.45
bn34 nan nan nan nan
我需要的如下所示。 基本上,在 df_dates 中有日期的地方,在 df_ratios 中會有一個相應的數字,我想將它們對齊在一起,並且忽略任何 nan。 我知道如何解決這個問題的唯一方法是簡單地遍歷數據幀中的每一行和每一列並應用一些簡單的邏輯。 我想知道在熊貓中是否有更有效的方法?
df_result
id dates ratios
1sds 20200108 1.34
bhu6 20190404 2.6
lm55 20200623 0.23
lm55 20201215 0.45
如果DataFrames
絕對對齊,則可以使用set_index
、 stack
和concat
:
(pd.concat([df_dates.set_index('id').stack().rename('dates'),
df_ratios.set_index('id').stack().rename('ratios')], axis=1)
.reset_index(level=0).reset_index(drop=True))
[出去]
id dates ratios
0 1sds 20200108.0 1.34
1 bhu6 20190404.0 2.60
2 lm55 20200623.0 0.23
3 lm55 20201215.0 0.45
國際大學聯盟,
如果您的結果排序正確,我們可以融化和連接。
new_df = pd.concat([
pd.melt(df1, id_vars="id",value_name='month').drop("variable", axis=1),
pd.melt(df2, id_vars="id",value_name='ratio').drop(["variable","id"], axis=1)
],
axis=1
).dropna()
print(new_df)
id month ratio
1 bhu6 20190404.0 2.60
8 1sds 20200108.0 1.34
10 lm55 20200623.0 0.23
14 lm55 20201215.0 0.45
您可以從每個數據框中創建單獨的Series
對象,然后在索引上合並。
s1 = df_dates.set_index('id').stack().astype(int)
s2 = df_ratios.set_index('id').stack()
s1.name = 'dates'
s2.name = 'ratios'
pd.merge(s1, s2, left_index=True, right_index=True).reset_index(level=0)
# returns:
id dates ratios
col3 1sds 20200108 1.34
col1 bhu6 20190404 2.60
col3 lm55 20200623 0.23
col4 lm55 20201215 0.45
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.