【问题标题】:Selecting specific rows in pandas dataframe merging在熊猫数据框合并中选择特定行
【发布时间】:2021-07-17 06:25:15
【问题描述】:

我保留的数组中有 4 个数据帧。

     0    1    2
0  0.0  1.0  2.0
1  0.0  1.0  2.0
2  0.0  1.0  2.0
3  0.0  1.0  2.0
4  0.0  2.0  3.0
5  0.0  2.0  3.0
6  0.0  3.0  4.0
7  0.0  3.0  4.0

     0    1    2
0  1.0  4.0  4.0
1  1.0  5.0  5.0

     0    1    2
0  2.0  6.0  4.0

     0    1    2
0  3.0  7.0  6.0

我想要做的大致是根据某些条件组合这些数据帧。例如,将第一个数据帧中第 0 行第 1 列中的值开始的数据帧添加到第一个数据帧。结果,第一个数据帧采用如下格式:

     0    1    2   3    4    5
0  0.0  1.0  2.0
1  0.0  1.0  2.0
2  0.0  1.0  2.0 1.0  4.0  4.0
3  0.0  1.0  2.0 1.0  5.0  5.0
4  0.0  2.0  3.0
5  0.0  2.0  3.0 2.0  6.0  4.0
6  0.0  3.0  4.0
7  0.0  3.0  4.0 3.0  7.0  6.0

dict格式的数据状态。

{0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0}, 1: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 2.0, 5: 2.0, 6: 3.0, 7: 3.0}, 2: {0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 4.0}}
{0: {0: 1.0, 1: 1.0}, 1: {0: 4.0, 1: 5.0}, 2: {0: 4.0, 1: 5.0}}
{0: {0: 2.0}, 1: {0: 6.0}, 2: {0: 4.0}}
{0: {0: 3.0}, 1: {0: 7.0}, 2: {0: 6.0}}

我也尝试了各种算法,都无法解决这部分的问题。

【问题讨论】:

    标签: python pandas dataframe merge rows


    【解决方案1】:

    首先,将df2df3df4的列从0,1,2重命名为3,4,5

    for df in [df2, df3, df4]:
        df.rename(columns={0:3, 1:4, 2:5}, inplace=True)
    

    其次,将这些列的索引更改为df1中要追加它们的行索引

    df2.index = [2,3]
    df3.index = [5]
    df4.index = [7]
    

    现在,您可以使用两个连续的pd.concat,以获得预期的数据帧输出。第一个 concat 连接行中的 df2df3df4,第二个 concat 将此输出连接到列上的 df1,如下所示:

    pd.concat([df1,pd.concat([df2, df3, df4], axis=0)], axis=1 )
    

    输出

         0    1    2    3    4    5
    0  0.0  1.0  2.0  NaN  NaN  NaN
    1  0.0  1.0  2.0  NaN  NaN  NaN
    2  0.0  1.0  2.0  1.0  4.0  4.0
    3  0.0  1.0  2.0  1.0  5.0  5.0
    4  0.0  2.0  3.0  NaN  NaN  NaN
    5  0.0  2.0  3.0  2.0  6.0  4.0
    6  0.0  3.0  4.0  NaN  NaN  NaN
    7  0.0  3.0  4.0  3.0  7.0  6.0
    

    【讨论】:

      【解决方案2】:

      如果1 所在的行在第一个数据帧上保持不变,您可以稍微玩一下索引,我们不要创建数据帧:

      df = pd.DataFrame({0: {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0, 5: 0.0, 6: 0.0, 7: 0.0}, 1: {0: 1.0, 1: 1.0, 2: 1.0, 3: 1.0, 4: 2.0, 5: 2.0, 6: 3.0, 7: 3.0}, 2: {0: 2.0, 1: 2.0, 2: 2.0, 3: 2.0, 4: 3.0, 5: 3.0, 6: 4.0, 7: 4.0}})
      df_1 = pd.DataFrame({0: {0: 1.0, 1: 1.0}, 1: {0: 4.0, 1: 5.0}, 2: {0: 4.0, 1: 5.0}})
      df_2 = pd.DataFrame({0: {0: 2.0}, 1: {0: 6.0}, 2: {0: 4.0}})
      df_3 = pd.DataFrame({0: {0: 3.0}, 1: {0: 7.0}, 2: {0: 6.0}})
      

      重命名 df_X 的列:

      df_1.columns = [4, 5, 6]
      df_2.columns = [4, 5, 6]
      df_3.columns = [4, 5, 6]
      

      然后:使用cumcount 更改dfindex,然后使用index1 作为键更改merge 数据帧,最后,使用iloc 调整数据帧并将nan 值移动到thop

      df.index = df.groupby(1).cumcount()
      
      df_merged = df.reset_index().merge(
          pd.concat([df_1, df_2, df_3], axis=0).reset_index(),
          left_on=(1, 'index'),
          right_on=(4, 'index'),
          how='left'
      ).drop('index', axis=1)
      
      df_merged.groupby(1).apply(
          lambda df: df.iloc[
              np.roll(np.arange(df.shape[0]), df[4].isnull().sum())
          ]
      ).reset_index(drop=True)
      
      
      #       0       1       2       4       5       6
      # 0     0.0     1.0     2.0     NaN     NaN     NaN
      # 1     0.0     1.0     2.0     NaN     NaN     NaN
      # 2     0.0     1.0     2.0     1.0     4.0     4.0
      # 3     0.0     1.0     2.0     1.0     5.0     5.0
      # 4     0.0     2.0     3.0     NaN     NaN     NaN
      # 5     0.0     2.0     3.0     2.0     6.0     4.0
      # 6     0.0     3.0     4.0     NaN     NaN     NaN
      # 7     0.0     3.0     4.0     3.0     7.0     6.0
      

      【讨论】:

      • 由于某种原因,您提到的输出与第二行和第三行不匹配。
      猜你喜欢
      • 2018-05-20
      • 2022-01-21
      • 2019-06-29
      • 1970-01-01
      • 2016-12-08
      • 2015-12-03
      • 2018-03-13
      • 2015-03-29
      • 2020-12-23
      相关资源
      最近更新 更多