如何根据 Pandas 中的条件创建数据框行的修改副本?

How to create modified copy of dataframe rows based on conditions in Pandas?

我有一个 Pandas 数据框,其中包含几列和几行。

    ColXYZ. Interval.  Temperature.  Pressure.  ColCDE.
A.    121       0            25           60        0.195
B.    246       4            40           50        0.350
C.    241       0            40           50        0.133
    ....

我想在 Interval 值为 0 时为每一行创建重复值,并为数据集中的所有 TemperaturePressure 条件创建它 - 例如创建行 A 的副本,除了温度和压力发生变化外,所有值都相同,为行 C 创建副本,除了温度和压力发生变化外,所有值都相同。这是为了反映在间隔为 0 时,无论温度和压力如何,数据集行中的所有其他条目都保持不变。 所需的输出如下:-

ColXYZ. Interval.  Temperature.  Pressure.  ColCDE.
121       0            25           60        0.195 #A
121       0            40           50        0.195 #Modified A copy
246       4            40           50        0.350 #B
241       0            40           50        0.133 #C
241       0            25           60        0.133 #Modified C copy

如有任何帮助和建议,我们将不胜感激。

最理想的出路是交叉表,见下面的代码

  m=df['Interval.']==0



 new=(
    
        df[['Temperature.','Pressure.']]#Subset all temps
     
        .merge# cross merge to subset of dfs with interval=0

        (df[m].reset_index(),how='cross',suffixes = ('','_y')).drop_duplicates().drop(columns=['Temperature._y','Pressure._y'])# append back to subset of original df whose Interval was not 0

        .append(df[~m].reset_index())# sort values by index

        .sort_values(by=['index'])
    )

结果

   Temperature.  Pressure. index  ColXYZ.  Interval.  ColCDE.
0          25.0       60.0    A.    121.0        0.0    0.195
2          40.0       50.0    A.    121.0        0.0    0.195
0          40.0       50.0    B.    246.0        4.0    0.350
1          25.0       60.0    C.    241.0        0.0    0.133
3          40.0       50.0    C.    241.0        0.0    0.133

另一种方法是创建重复行并插入,详情如下 原df

    ColXYZ  Interval  Temperature  Pressure  ColCDE
A.     121         0           25        60   0.195
B.     246         4           40        50   0.350
C.     241         0           40        50   0.133

#生成温度和压力列表

df=df.reset_index()#to preserve index
m=df['Interval']==0#selection of soert criteria
s=df['Temperature'].agg(list)
s1=df['Pressure'].agg(list)

#df中的重复行

df1 = pd.DataFrame(np.repeat(df[m].values, len(df), axis=0), columns=df.columns)

#distribute 温度和压力值以确保原始 df 中的每个唯一值都在每个唯一的 ColXYZ 中表示

df1['Temperature']= np.tile(s, int(len(df1)/(len(s))))
df1['Pressure']= np.tile(s1, int(len(df1)/(len(s1))))

#删除重复项

   df1= df[~m].append(df1.assign(Temperature=np.tile(s, int(len(df1)/(len(s)))),Pressure= np.tile(s1, int(len(df1)/(len(s1))))).drop_duplicates()).sort_values(by=['index'])

结果

   index ColXYZ Interval  Temperature  Pressure ColCDE
0    A.    121        0           25        60  0.195
1    A.    121        0           40        50  0.195
1    B.    246        4           40        50   0.35
3    C.    241        0           25        60  0.133
4    C.    241        0           40        50  0.133