如何根据 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 时为每一行创建重复值,并为数据集中的所有 Temperature
和 Pressure
条件创建它 - 例如创建行 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
我有一个 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 时为每一行创建重复值,并为数据集中的所有 Temperature
和 Pressure
条件创建它 - 例如创建行 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