Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在一个键列上合并多个数据帧(3+;)的细微差别_Python_Pandas_Dataframe_Merge_Multi Index - Fatal编程技术网

Python 在一个键列上合并多个数据帧(3+;)的细微差别

Python 在一个键列上合并多个数据帧(3+;)的细微差别,python,pandas,dataframe,merge,multi-index,Python,Pandas,Dataframe,Merge,Multi Index,这里的第一个问题和一个很长的问题——关于合并和格式化我的数据帧,有几件事我正在努力解决。我有一些半途而废的解决方案,但我不确定它们是否是基于我想要的最好的解决方案 以下是我正在与pandas合并的数据帧的标准格式 df1 = RT %Area RRT 0 4.83 5.257 0.509 1 6.76 0.424 0.712 2 7.27 0.495 0.766 3 7.70 0.257 0.811 4 7.79 0.122

这里的第一个问题和一个很长的问题——关于合并和格式化我的数据帧,有几件事我正在努力解决。我有一些半途而废的解决方案,但我不确定它们是否是基于我想要的最好的解决方案

以下是我正在与pandas合并的数据帧的标准格式

df1 =
      RT   %Area    RRT
0   4.83   5.257  0.509
1   6.76   0.424  0.712
2   7.27   0.495  0.766
3   7.70   0.257  0.811
4   7.79   0.122  0.821
5   9.49  92.763  1.000
6  11.40   0.681  1.201

df2= 
    RT   %Area    RRT
0   4.83   0.731  0.508
1   6.74   1.243  0.709
2   7.28   0.109  0.766
3   7.71   0.287  0.812
4   7.79   0.177  0.820
5   9.50  95.824  1.000
6  11.31   0.348  1.191
7  11.40   1.166  1.200
8  12.09   0.113  1.273

df3 = ...
目前,我正在对
pd.merge\u ordered()
使用reduce操作来合并我的数据帧(3+)。这种方法产生了我想要的结果,这是前面一个问题()的结果。我正在RRT上进行合并,并希望具有相同RRT值的索引放在同一行上-如果该数据集的RRT值是唯一的,我希望其他数据集中缺失的数据为NaN

#The for loop I use to generate the list of formatted dataframes prior to merging
dfs = []
for entry in os.scandir(directory):
    if (entry.path.endswith(".csv")) and entry.is_file():
        entry = pd.read_csv(entry.path, header=None)
        #Block of formatting code removed
        dfs.append(entry.round(2))

dfs = [df1ar,df2ar,df3ar]
df_final = reduce(lambda left,right: pd.merge_ordered(left,right,on='RRT'), dfs)
cols = ['RRT', 'RT_x', '%Area_x', 'RT_y', '%Area_y', 'RT', '%Area']
df_final = df_final[cols]
print(df_final)

      RRT   RT_x  %Area_x   RT_y  %Area_y     RT   %Area
0   0.508    NaN      NaN   4.83    0.731    NaN     NaN
1   0.509   4.83    5.257    NaN      NaN   4.83   5.257
2   0.709    NaN      NaN   6.74    1.243    NaN     NaN
3   0.712   6.76    0.424    NaN      NaN   6.76   0.424
4   0.766   7.27    0.495   7.28    0.109   7.27   0.495
5   0.811   7.70    0.257    NaN      NaN   7.70   0.257
6   0.812    NaN      NaN   7.71    0.287    NaN     NaN
7   0.820    NaN      NaN   7.79    0.177    NaN     NaN
8   0.821   7.79    0.122    NaN      NaN   7.79   0.122
9   1.000   9.49   92.763   9.50   95.824   9.49  92.763
10  1.191    NaN      NaN  11.31    0.348    NaN     NaN
11  1.200    NaN      NaN  11.40    1.166    NaN     NaN
12  1.201  11.40    0.681    NaN      NaN  11.40   0.681
13  1.273    NaN      NaN  12.09    0.113    NaN     NaN
这是可行的,但是:

  • 我是否可以根据数据来自的数据框的文件名插入多索引,并将其放置在相应列的上方?与后缀选项类似,但与文件名和两组以上的数据相关。在合并之前这样做更好吗?如果是,我该怎么做?(我已经包含了用于在合并之前创建表列表的
    for
    循环

  • 这是最简单的方法吗

  • 我是否可以使用
    pd.merge\u asof()
    进行类似的合并,并使用容差值根据RRT值之间的相似性微调合并?也就是说,是否可以在不切断较长数据帧数据的情况下进行合并?

  • 我已经尝试了上述方法并寻找答案,但我正在努力找到最有效的方法来做我想做的一切

    concat = pd.concat(dfs, axis=1, keys=['A','B','C'])
    concat_final = concat.round(3)
    print(concat_final)
    
      A                     B                     C               
          RT   %Area    RRT     RT   %Area    RRT     RT   %Area    RRT
    0   4.83   5.257  0.509   4.83   0.731  0.508   4.83   5.257  0.509
    1   6.76   0.424  0.712   6.74   1.243  0.709   6.76   0.424  0.712
    2   7.27   0.495  0.766   7.28   0.109  0.766   7.27   0.495  0.766
    3   7.70   0.257  0.811   7.71   0.287  0.812   7.70   0.257  0.811
    4   7.79   0.122  0.821   7.79   0.177  0.820   7.79   0.122  0.821
    5   9.49  92.763  1.000   9.50  95.824  1.000   9.49  92.763  1.000
    6  11.40   0.681  1.201  11.31   0.348  1.191  11.40   0.681  1.201
    7    NaN     NaN    NaN  11.40   1.166  1.200    NaN     NaN    NaN
    8    NaN     NaN    NaN  12.09   0.113  1.273    NaN     NaN    NaN
    
    我也尝试过这个方法——我得到了多索引来表示它来自哪个文件(A、B、C,就像占位符一样)。但是,它显然没有像我想要的那样基于RRT值进行合并

  • 我可以应用一个操作将其更改为与上面的
    pd.merge\u ordered()
    格式类似的格式吗?
    groupby()
    是否有效
  • 谢谢