Python:合并数据框并将所有值保留在单元格中(如果不相同)

标签 python pandas dataframe merge concatenation

所以我正在尝试合并多个 excel 文件。每个文件将具有不同的尺寸。某些文件可能具有相同的列名,其中数据为 NULL、相同或不同。我编写的脚本合并了具有不同维度的多个文件,并删除了重复的列,最后一个值被删除到最后一个列单元格中。但是,我正在尝试连接值(如果不相等),以便用户可以手动查看 excel 中的重复数据。

例子: 用户 1 在 df 表中的年龄 = 24,在 df1 中的年龄 = 27。我正在尝试在最终合并输出中获取该单元格中的两个值。

输入: df

<表类="s-表"> <头> 用户 年龄 团队 <正文> 1 24 x 2 56 是 3 32 z
df = pd.DataFrame({'user': ['1', '2', '3'],
                    'age': [24,56,32],
                    'team': [x,y,z]})

df1

<表类="s-表"> <头> 用户 年龄 名字 <正文> 1 27 罗纳德 2 NaN 尤金 4 44 杰夫 5 61 小甜甜
df = pd.DataFrame({'user': ['1','2','4','5'],
                    'age': [27,NaN,44,61],
                    'name': ['Ronald','Eugene','Jeff','Britney']})

预期输出:

案例:

  1. 两个相同的值:保留一个

  2. 一个值为NaN:保留非NaN值

  3. 两个不同的值:用定界符连接,以便稍后查看。我会突出显示它。

<表类="s-表"> <头> 用户 年龄 团队 名字 <正文> 1 24 27 2 56 是 尤金 3 32 z NaN 4 44 NaN 杰夫 5 61 NaN 小甜甜

这是我目前所拥有的。用户将文件拖放到指定文件夹中,然后遍历所有 excel 文件。第一个循环将数据附加到 df 数据帧中,每个下一个循环都是合并。问题是,我只从最后一个循环中获取值(如果不为空)。

df = pd.DataFrame()

for excel_files in FILELIST:
    if excel_files.endswith(".xlsx"):
        df1 = pd.read_excel(FILEPATH_INPUT+excel_files, dtype=str)
        print(excel_files)

        if df.empty:
            df = df.append(df1)
        else:
            df = pd.merge(df,df1,on=UNIQUE_KEY,how=JOIN_METHOD,suffixes=('','_dupe'))
            df.drop([column for column in df.columns if '_dupe' in column],axis=1, inplace=True)

这就是输出的样子

<表类="s-表"> <头> 用户 年龄 团队 名字 <正文> 1 27 x 罗纳德 2 56 是 尤金 3 32 z NaN 4 44 NaN 杰夫 5 61 NaN 小甜甜

尝试遍历列然后连接。我可以在 df[new_col] 中看到组合值,但它无法更新 df 数据框,最终输出显示 NaN。

df = pd.DataFrame()

for excel_files in FILELIST:
    if excel_files.endswith(".xlsx"):
        df1 = pd.read_excel(FILEPATH_INPUT+excel_files, dtype=str)
        #df1.set_index('uid',inplace=True)
        print(excel_files)
        #print(df1)
        #print(df1.dtypes)

        if df.empty:
            df = df.append(df1)
        else:
            df = pd.merge(df,df1,on=UNIQUE_KEY,how=JOIN_METHOD,suffixes=('','_dupe'))
            #df.drop([column for column in df.columns if '_dupe' in column],axis=1, inplace=True)

            cols_to_remove = df.columns
            for column in cols_to_remove:
                if "_dupe" in column:
                    new_col = str(column).replace('_dupe','')

                    df[new_col] = df[new_col].str.cat(df[column],sep='||')
                    print('New Values: ',df[new_col])
                    df.pop(column)

任何帮助将不胜感激。谢谢拉夫

最佳答案

我会 merge , 然后申请 groupby.agg在列上:

merged = df.merge(df1, on='user', how='outer', suffixes=('', '_dupe'))

out = (merged
 .groupby(merged.columns.str.replace('_dupe', ''), sort=False, axis=1)
 .agg('last')
)

输出:

  user   age  team     name
0    1  27.0     x   Ronald
1    2  56.0     y   Eugene
2    3  32.0     z     None
3    4  44.0  None     Jeff
4    5  61.0  None  Britney

替代输出:

out = (merged
 .groupby(merged.columns.str.replace('_dupe', ''), sort=False, axis=1)
 .agg(lambda g: g.agg(lambda s: '|'.join(s.dropna().unique().astype(str)), axis=1))
)

输出:

  user        age team     name
0    1  24.0|27.0    x   Ronald
1    2       56.0    y   Eugene
2    3       32.0    z         
3    4       44.0          Jeff
4    5       61.0       Britney

关于Python:合并数据框并将所有值保留在单元格中(如果不相同),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75056155/

相关文章:

python - 使用 Pandas MultiIndex 在 matplotlib 条形图中对标签进行分组

python - 删除包含特定模式的行 [Python/Pandas]

python - 使用 boolean 逻辑合并和过滤一个数据帧的多列

python - 在 RandomForestRegressor 中得到连续不支持的错误

python - 如果 PYTHON 中的 CSV 记录表中尚不存在记录,则插入记录

带有 * 的 Python zip 行为

python - 如何连接两个独立数据库的两个模型 python peewee

python - 如何从 python 中的日期时间系列中删除年月日?

python - 使用 pandas MultiIndex 时如何根据索引值进行插值?

python - "TypeError: ' DataFrame ' objects are mutable, thus they cannot be hashed"while sorting pandas dataframe index