pandas Python:合并 Dataframe 并保留单元格中不相同的所有值

ux6nzvsh  于 2023-01-15  发布在  Python
关注(0)|答案(1)|浏览(264)

因此,我尝试合并多个excel文件。每个文件将具有不同的维度。有些文件可能具有相同的列名,其中数据为NULL,相同或不同。我编写的脚本合并具有不同维度的多个文件,并删除重复的列,最后一个值将被丢弃到最后一个列单元格中。然而,我尝试将值连接起来,如果不相等,以便用户在excel中手动检查重复数据。
示例:用户1在df表中的age = 24,在df 1中的age = 27。我尝试在最终合并输出中获取该单元格中的两个值。
输入:df
| 用户|年龄|团队|
| - ------|- ------|- ------|
| 1个|二十四|x|
| 第二章|五十六|Y型|
| 三个|三十二|z|

df = pd.DataFrame({'user': ['1', '2', '3'],
                    'age': [24,56,32],
                    'team': [x,y,z]})

DF1
| 用户|年龄|姓名|
| - ------|- ------|- ------|
| 1个|二十七|罗纳德|
| 第二章|钠氮|尤金|
| 四个|四十四|杰夫|
| 五个|六十一|布兰妮|

df = pd.DataFrame({'user': ['1','2','4','5'],
                    'age': [27,NaN,44,61],
                    'name': ['Ronald','Eugene','Jeff','Britney']})

预期输出:
病例:
1.两个相同的值:保留一个
1.一个值是NaN:保留非NaN值
1.两个不同的值:使用分隔符进行连接,以便稍后查看。我将突出显示它。
| 用户|年龄|团队|姓名|
| - ------|- ------|- ------|- ------|
| 1个|二十四||二十七|
| 第二章|五十六|Y型|尤金|
| 三个|三十二|z|钠氮|
| 四个|四十四|钠氮|杰夫|
| 五个|六十一|钠氮|布兰妮|
这是我到目前为止所做的。用户将文件放入指定的文件夹,然后循环遍历所有Excel文件。第一个循环将数据附加到df Dataframe 中,每个下一个循环都是合并。问题是,我只从最后一个循环中获取值(如果不为空)。

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)

这就是OUTPUT的外观
| 用户|年龄|团队|姓名|
| - ------|- ------|- ------|- ------|
| 1个|二十七|x|罗纳德|
| 第二章|五十六|Y型|尤金|
| 三个|三十二|z|钠氮|
| 四个|四十四|钠氮|杰夫|
| 五个|六十一|钠氮|布兰妮|
尝试循环通过列,然后连接。我可以看到df[new_col]中的组合值,但它无法更新df Dataframe ,最终输出显示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)

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

cqoc49vn

cqoc49vn1#

我将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

相关问题