【问题标题】:Pandas: How to reshape multiple dataframes into a common form?Pandas:如何将多个数据框重塑为通用形式?
【发布时间】:2020-05-19 22:05:37
【问题描述】:

(可重复的例子和最后的微弱尝试)

我有两个数据框,df1 和 df2:

df1:

    Col_A   Col_B   Col_D
1   NaN     21      NaN
2   10      NaN     33
4   12      23      38

df2:

    Col_C   Col_E
2   22      44
3   NaN     45
5   4       48

我想找一个像这样的通用形式:

df_common:

    Col_A   Col_B   Col_C   Col_D   Col_E
1   NaN     NaN     NaN     NaN     NaN
2   NaN     NaN     NaN     NaN     NaN
3   NaN     NaN     NaN     NaN     NaN
4   NaN     NaN     NaN     NaN     NaN
5   NaN     NaN     NaN     NaN     NaN

...我得到了所有列名和行索引的union,并且只有NaN 值:

然后我想填写 df1 和 df2 的值(仍然在两个单独的表中),以便我最终得到:

df1_desired

    Col_A   Col_B   Col_C   Col_D   Col_E
1   NaN     21      NaN     NaN     NaN
2   10      NaN     NaN     33      NaN
3   NaN     NaN     NaN     NaN     NaN
4   12      23      NaN     NaN     NaN
5   NaN     NaN     NaN     38      NaN

df2_resired:

    Col_A   Col_B   Col_C   Col_D   Col_E
1   NaN     NaN     NaN     NaN     NaN
2   NaN     NaN     22      NaN     44
3   NaN     NaN     NaN     NaN     35
4   NaN     NaN     NaN     NaN     NaN
5   NaN     NaN     4       NaN     48

我用pd.merge() 和df.update() 尝试了各种尝试,但没有成功

但我已经接受了这样一个事实,即我什至不知道如何正确地称呼这个特殊的挑战。感谢您的任何建议!

可重现的例子:

import pandas as pd
import numpy as np

df1 = pd.DataFrame({'Col_A': {1: np.nan, 2: '10', 4: '12'},
        'Col_B': {1: '21', 2: np.nan, 4: '23'},
        'Col_D': {1: np.nan, 2: '33', 4: '38'}})

df2 = pd.DataFrame({'Col_C': {2: '22', 3: np.nan, 5: '4'},
                    'Col_E': {2: 44, 3: 45, 5: 48}})

df1_desired = pd.DataFrame({'Col_A': {1: np.nan, 2: '10', 3: np.nan, 4: '12', 5: np.nan},
                        'Col_B': {1: '23', 2: np.nan, 3: np.nan, 4: '23', 5: np.nan},
                        'Col_C': {1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: np.nan},
                        'Col_D': {1: np.nan, 2: '22', 3: np.nan, 4: np.nan, 5: '4'},
                        'Col_E': {1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: np.nan}})

df2_desired = pd.DataFrame({'Col_A': {1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: np.nan},
                        'Col_B': {1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: np.nan},
                        'Col_C': {1: np.nan, 2: '22', 3: np.nan, 4: np.nan, 5: '4'},
                        'Col_D': {1: np.nan, 2: np.nan, 3: np.nan, 4: np.nan, 5: np.nan},
                        'Col_E': {1: np.nan, 2: '44', 3: '35', 4: np.nan, 5: '48'}})

# find the commons
common_cols = sorted(list(set().union(list(df1),list(df2))))
common_rows = sorted(list(set().union(list(df1.index),list(df2.index))))
df_common = pd.DataFrame(np.nan, index=common_rows, columns=common_cols)

# attempt at reshaping df1 with pd.merge
# https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.merge.html
df1_reshaped = pd.merge(df_common, df1, how='left', left_index=True, right_index=True)

# attempt at dropping duplicates for df1
#df1_reshaped = df1_reshaped[df1_reshaped.columns.drop(list(df1_reshaped.filter(regex='_x')))]
#df1_reshaped.columns = df_common.columns

# attempt with df.update()
# https://stackoverflow.com/questions/9787853/join-or-merge-with-overwrite-in-pandas
df1_updated=df_common.update(df1)

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以使用:

    s=df1.combine_first(df2)
    df1=df1.reindex_like(s)
       Col_A  Col_B  Col_C  Col_D  Col_E
    1    NaN   21.0    NaN    NaN    NaN
    2   10.0    NaN    NaN   33.0    NaN
    3    NaN    NaN    NaN    NaN    NaN
    4   12.0   23.0    NaN   38.0    NaN
    5    NaN    NaN    NaN    NaN    NaN
    

    【讨论】:

    • 非常感谢!该方法是完美的,尽管每个示例应该是s=df_common.combine_first(df1); df1=df1.reindex_like(s)。 (顺便说一句不是我的反对票!)。
    • @vestland yw:-) 快乐编码
    • 有人可能测试了您的方法,但没有发现该方法是正确的,但根据问题,参考不是​​ 100% 正确的。但我觉得这个责任在 我 肩上,因为没有正确解释挑战。我希望投反对票的人能看到这一点并做出正确的决定。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 2021-02-24
    • 2012-12-10
    • 2016-12-05
    • 1970-01-01
    • 1970-01-01
    • 2021-05-12
    • 2020-04-19
    相关资源
    最近更新 更多