我想连接来自多个 Dataframe 的列。这个想法是,有一些值是匹配的,有些不是来自这些列。我希望它按字母顺序排列,并且它是一个完整的外部连接,其中所有值都连接,如果两列的值匹配,将在同一行排序,如果不是,一行将被添加到另一列中,其值为N/A。我试过这个allnames = pd.concat(lstnames,axis=1,ignore_index=True,join='outer',sort=False)但它返回以下内容:
注意它不是按字母顺序排列的。如何解决这个问题?
v6ylcynt1#
当前方法的问题是pd.concat连接列时没有考虑index作为合并键。要实现所需的输出,可以将pd.merge与how='outer'一起使用,然后对结果DataFrame进行排序。假设你有两个 Dataframe ,df1和df2:
pd.concat
pd.merge
how='outer'
import pandas as pd data1 = {'Names': ['Alice', 'Bob', 'Cathy']} data2 = {'Names': ['David', 'Bob', 'Eva']} df1 = pd.DataFrame(data1) df2 = pd.DataFrame(data2)
一种方法可以是使用将合并 Dataframe 上的值的自定义函数。
def merge_dataframes(df_list, column_name): merged_df = pd.DataFrame() for df in df_list: df[column_name] = df[column_name].astype(str) df = df.set_index(column_name) if merged_df.empty: merged_df = df else: merged_df = merged_df.combine_first(df) merged_df = merged_df.reset_index() merged_df = merged_df.sort_values(by=column_name) merged_df = merged_df.reset_index(drop=True) return merged_df
立即使用该功能
merged_df = merge_dataframes([df1, df2], 'Names')
这个应该可以了。
1条答案
按热度按时间v6ylcynt1#
当前方法的问题是
pd.concat
连接列时没有考虑index作为合并键。要实现所需的输出,可以将pd.merge
与how='outer'
一起使用,然后对结果DataFrame进行排序。假设你有两个 Dataframe ,df1和df2:
一种方法可以是使用将合并 Dataframe 上的值的自定义函数。
立即使用该功能
这个应该可以了。